Qt解析CSV文件

最近需要解析Excel文件,于是顺带写了解析CSV的代码

定义数据类型LX::Sheet

 1 #ifndef LX_H
 2 #define LX_H
 3
 4 #include <QString>
 5 #include <QStringList>
 6
 7 namespace LX
 8 {
 9 class Sheet
10 {
11     enum FieldType{STRING, INT, DOUBLE, BOOL};
12 public:
13     Sheet(){}
14     Sheet(Sheet&& rhs);
15     Sheet &operator =(Sheet &&rhs);
16 public:
17     QString name;
18     QList<QStringList> data;
19     QList<FieldType> fieldTypes;
20 };
21 }
22
23 #endif // LX_H
//解析CSV文件 1 LX::Sheet FileParse::parseCSV(const QString &fileName)
 2 {
 3     LX::Sheet sheet;
 4
 5     int nameStartIndex = fileName.lastIndexOf(‘/‘) + 1;
 6     if(nameStartIndex < 1)
 7     {
 8         nameStartIndex = fileName.lastIndexOf(‘\\‘) + 1;
 9     }
10     int nameEndIndex = fileName.lastIndexOf(‘.‘);
11     sheet.name = fileName.mid(nameStartIndex, nameEndIndex - nameStartIndex);
12
13     QFile file(fileName);
14     if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
15     {
16         return sheet;
17     }
18
19     QTextStream inStream(&file);
20
21     for( QString lineStr; !inStream.atEnd(); )
22     {
23         lineStr = inStream.readLine();
24         if(lineStr.isEmpty())
25         {
26             continue;
27         }
28
29         sheet.data.append(splitCSVLine(lineStr));
30     }
31
32     return qMove(sheet);
33 }
34
35 QStringList FileParse::splitCSVLine(const QString &lineStr)
36 {
37     QStringList strList;
38     QString str;
39
40     int length = lineStr.length();
41     int quoteCount = 0;
42     int repeatQuoteCount = 0;
43
44     for(int i = 0; i < length; ++i)
45     {
46         if(lineStr[i] != ‘\"‘)
47         {
48             repeatQuoteCount = 0;
49             if(lineStr[i] != ‘,‘)
50             {
51                 str.append(lineStr[i]);
52             }
53             else
54             {
55                 if(quoteCount % 2)
56                 {
57                     str.append(‘,‘);
58                 }
59                 else
60                 {
61                     strList.append(str);
62                     quoteCount = 0;
63                     str.clear();
64                 }
65             }
66         }
67         else
68         {
69             ++quoteCount;
70             ++repeatQuoteCount;
71             if(repeatQuoteCount == 4)
72             {
73                 str.append(‘\"‘);
74                 repeatQuoteCount = 0;
75                 quoteCount -= 4;
76             }
77         }
78     }
79     strList.append(str);
80
81     return qMove(strList);
82 }

生成CSV文件

 1 bool FileParse::generateCSV(const QString &fileName, const LX::Sheet &sheet)
 2 {
 3     QFile file(fileName);
 4     bool openOk = file.open(QIODevice::WriteOnly);
 5     if(!openOk)
 6     {
 7         return false;
 8     }
 9     QTextStream outStream(&file);
10
11     int strCount = sheet.data.count();
12     for(int i = 0; i < strCount; ++i)
13     {
14         outStream << joinCSVStrs(sheet.data.at(i));
15         outStream << ‘\n‘;
16     }
17
18     return true;
19 }
 1 QString FileParse::joinCSVStrs(const QStringList &strList)
 2 {
 3     QString lineStr;
 4
 5     int strCount = strList.count();
 6     int lastStrIndex = strCount - 1;
 7
 8     for(int k = 0; k < strCount; ++k)
 9     {
10         QString tarStr;
11         bool commaFlag = false;
12
13         const QString& oriStr = strList.at(k);
14         int length = oriStr.length();
15         for(int i = 0; i < length; ++i)
16         {
17             if(oriStr[i] == ‘,‘)
18             {
19                 tarStr.append(oriStr[i]);
20                 commaFlag = true;
21             }
22             else if(oriStr[i] == ‘\"‘)
23             {
24                 tarStr.append("\"\"\"\"");
25             }
26             else
27             {
28                 tarStr.append(oriStr[i]);
29             }
30         }
31         if(commaFlag)
32         {
33             tarStr.push_front(‘\"‘);
34             tarStr.push_back(‘\"‘);
35         }
36         if(k != lastStrIndex)
37         {
38             tarStr.append(‘,‘);
39         }
40
41         lineStr.append(tarStr);
42     }
43
44     return qMove(lineStr);
45 }

解析规则为:

1、若逗号间无数据,仍解释为空数据

2、若字段中含有逗号则用"将字段包含起来

3、若数据中存在 " ,则将其替换为 """"

转自:http://www.cnblogs.com/lixtary/p/4252586.html

时间: 2024-12-26 15:33:12

Qt解析CSV文件的相关文章

练习:读取解析CSV文件,将读取结果输出的控制台上,并封装到4个Teacher对象中.

/** *    读取解析CSV文件,将读取结果输出的控制台上,并封装到4个Teacher对象中. *    1, 土鳖, 13101015338, 北京海淀区 2, 咪咪, 13201015338, 北京朝阳区 3, 小仓, 13601015818, 北京宣武区 4, 饭岛爱, 13201025818, 北京朝阳区 /** * 读取解析CSV文件,将读取结果输出的控制台上,并封装到4个Teacher对象中. * 1, 土鳖, 13101015338, 北京海淀区 2, 咪咪, 13201015

php解析.csv文件

public function actionImport() { //post请求过来的 $fileName = $_FILES['file']['name']; $fileTmpName = $_FILES['file']['tmp_name']; //判断是否选择了上传的文件 if (empty($fileName)) { $data['message'] = "请选择要上传的文件"; return $this->render("batch_add", $

[cocos2dx utils] cocos2dx读取,解析csv文件

在我们的游戏中,经常需要将策划的数值配置成csv文件,所以解析csv文件就是一个很common的logic, 例如如下csv文件: 下面是一个基于cocos2dx 2.2.4的实现类: #ifndef __Cell__GCCsvHelper__ #define __Cell__GCCsvHelper__ #include <iostream> #include "cocos2d.h" #include <vector> USING_NS_CC; class GC

php解析csv文件

public function actionImport() { //post请求过来的 $fileName = $_FILES['file']['name']; $fileTmpName = $_FILES['file']['tmp_name']; //判断是否选择了上传的文件 if (empty($fileName)) { $data['message'] = "请选择要上传的文件"; return $this->render("batch_add", $

Qt生成CSV 文件

1.CSV 文件 不支持 EXCEL中 的多个工作表的模式. 一个 CVS 文件只能转换成 EXCEL 一个工作表. 2.逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本).纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据.CSV文件由任意数目的记录组成,记录间以某种换行符分隔:每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符.通常,所

如何用Java解析CSV文件

首先看一下csv文件的规则: csv(Comma Separate Values)文件即逗号分隔符文件,它是一种文本文件,可以直接以文本打开,以逗号分隔.windows默认用excel打开.它的格式包括以下几点(它的格式最好就看excel是如何解析的.): ①每条记录占一行: ②以逗号为分隔符: ③逗号前后的空格会被忽略: ④字段中包含有逗号,该字段必须用双引号括起来: ⑤字段中包含有换行符,该字段必须用双引号括起来: ⑥字段前后包含有空格,该字段必须用双引号括起来: ⑦字段中的双引号用两个双引

解析 csv文件 java &gt;&gt;&gt;&gt;&gt;最爱那水货

1 /** 2 * csv文件解析 <br> 3 * wx 微信明细数据 第1行是标题 ,最后2行 是总结 提取数据需要过滤<br> 4 * zfb 支付宝明细数据 前4行 和最后4行是总结 第5行是 标题 提取数据时需要过滤 5 * @param localPath 本地文件绝对路径 6 * @param flag 支付机构 wx zfb pos 7 * @return 8 */ 9 public List<String[]> csvAnalysis(String l

Qt解析XML文件(QXmlStreamReader)

(2013-08-03 10:53:53) 转载▼ 如何使用QXmlStreamReader来解析格式良好的XML,Qt的文档中指出,它是一种更快.更方便的Qt自己的SAX解析器(QXmlSimpleReader)的替代,它也较快,在某种情况下,比DOM(QDomDocument)更方便. XML文件: 解析方法: void ParseXML::parseXML(QString file_name) { if(file_name.isEmpty()) return; QFile *file =

linux awk解析csv文件

#!/bin/bashfor file in *.csvdo awk -F ',' 'begin {total=0;sum=0} {total++;if($1<=100.0 && $15!=0) sum++} END{ print FILENAME,"all",total, sum ,sum*1.0/total}' $file >> stat1.log awk -F ',' 'begin {total=0;sum=0} {total[$15]++;if