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

定义数据类型LX::Sheet

 #ifndef LX_H
#define LX_H #include <QString>
#include <QStringList> namespace LX
{
class Sheet
{
enum FieldType{STRING, INT, DOUBLE, BOOL};
public:
Sheet(){}
Sheet(Sheet&& rhs);
Sheet &operator =(Sheet &&rhs);
public:
QString name;
QList<QStringList> data;
QList<FieldType> fieldTypes;
};
} #endif // LX_H
//解析CSV文件
1 LX::Sheet FileParse::parseCSV(const QString &fileName)
{
LX::Sheet sheet; int nameStartIndex = fileName.lastIndexOf('/') + ;
if(nameStartIndex < )
{
nameStartIndex = fileName.lastIndexOf('\\') + ;
}
int nameEndIndex = fileName.lastIndexOf('.');
sheet.name = fileName.mid(nameStartIndex, nameEndIndex - nameStartIndex); QFile file(fileName);
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
return sheet;
} QTextStream inStream(&file); for( QString lineStr; !inStream.atEnd(); )
{
lineStr = inStream.readLine();
if(lineStr.isEmpty())
{
continue;
} sheet.data.append(splitCSVLine(lineStr));
} return qMove(sheet);
} QStringList FileParse::splitCSVLine(const QString &lineStr)
{
QStringList strList;
QString str; int length = lineStr.length();
int quoteCount = ;
int repeatQuoteCount = ; for(int i = ; i < length; ++i)
{
if(lineStr[i] != '\"')
{
repeatQuoteCount = ;
if(lineStr[i] != ',')
{
str.append(lineStr[i]);
}
else
{
if(quoteCount % )
{
str.append(',');
}
else
{
strList.append(str);
quoteCount = ;
str.clear();
}
}
}
else
{
++quoteCount;
++repeatQuoteCount;
if(repeatQuoteCount == )
{
str.append('\"');
repeatQuoteCount = ;
quoteCount -= ;
}
}
}
strList.append(str); return qMove(strList);
}

生成CSV文件

 bool FileParse::generateCSV(const QString &fileName, const LX::Sheet &sheet)
{
QFile file(fileName);
bool openOk = file.open(QIODevice::WriteOnly);
if(!openOk)
{
return false;
}
QTextStream outStream(&file); int strCount = sheet.data.count();
for(int i = ; i < strCount; ++i)
{
outStream << joinCSVStrs(sheet.data.at(i));
outStream << '\n';
} return true;
}
 QString FileParse::joinCSVStrs(const QStringList &strList)
{
QString lineStr; int strCount = strList.count();
int lastStrIndex = strCount - ; for(int k = ; k < strCount; ++k)
{
QString tarStr;
bool commaFlag = false; const QString& oriStr = strList.at(k);
int length = oriStr.length();
for(int i = ; i < length; ++i)
{
if(oriStr[i] == ',')
{
tarStr.append(oriStr[i]);
commaFlag = true;
}
else if(oriStr[i] == '\"')
{
tarStr.append("\"\"\"\"");
}
else
{
tarStr.append(oriStr[i]);
}
}
if(commaFlag)
{
tarStr.push_front('\"');
tarStr.push_back('\"');
}
if(k != lastStrIndex)
{
tarStr.append(',');
} lineStr.append(tarStr);
} return qMove(lineStr);
}

解析规则为:

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

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

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

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

Qt解析CSV文件的更多相关文章

  1. php解析.csv文件

    public function actionImport() { //post请求过来的 $fileName = $_FILES['file']['name']; $fileTmpName = $_F ...

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

    在我们的游戏中,经常需要将策划的数值配置成csv文件,所以解析csv文件就是一个很common的logic, 例如如下csv文件: 下面是一个基于cocos2dx 2.2.4的实现类: #ifndef ...

  3. .NET 上传并解析CSV文件存库

    1.前端: 放置浏览按钮 <div class="row inner_table text-center"> <input id="fileId&quo ...

  4. java opencsv解析csv文件

    记一次使用opencsv解析csv文件时碰到的坑 最近在开发过程中需要解析csv文件,公司用的解析工具是opencsv,在根据opencsv的官方文档去解析时发现csv文件中含有繁体字,使用其自带的C ...

  5. 解析 csv文件 java ***最爱那水货

    /** * csv文件解析 <br> * wx 微信明细数据 第1行是标题 ,最后2行 是总结 提取数据需要过滤<br> * zfb 支付宝明细数据 前4行 和最后4行是总结 ...

  6. 如何用Java解析CSV文件

    首先看一下csv文件的规则: csv(Comma Separate Values)文件即逗号分隔符文件,它是一种文本文件,可以直接以文本打开,以逗号分隔.windows默认用excel打开.它的格式包 ...

  7. Qt生成CSV 文件

    1.CSV 文件 不支持 EXCEL中 的多个工作表的模式. 一个 CVS 文件只能转换成 EXCEL 一个工作表. 2.逗号分隔值(Comma-Separated Values,CSV,有时也称为字 ...

  8. Qt中csv文件的导入与导出

    转自:http://blog.csdn.net/mingxia_sui/article/details/7683030 CSV 1.简介: 全称:Comma Separated Values. 是“逗 ...

  9. 初识---Qt解析XML文件(QDomDocument)

    关于XML及其使用场景不在此多做介绍,今天主要介绍Qt中对于XML的解析.QtXml模块提供了一个读写XML文件的流,解析方法包含DOM和SAX,两者的区别是什么呢?  DOM(Document Ob ...

随机推荐

  1. Oracle 一行拆分为多行

    测试数据: CREATE TABLE t (str VARCHAR2(30)); INSERT INTO t VALUES ( 'X,Y,Z' ); INSERT INTO t VALUES ( 'X ...

  2. 目标跟踪之meanshift---均值漂移搞起2000过时的

    基于灰度均值分布的目标跟踪! http://blog.csdn.net/wds555/article/details/24499599 但他有些有点: 1.不会受遮挡太多影响 Mean Shift跟踪 ...

  3. springboot中tomcat找不到jsp页面【转载】

    这个原理还没搞明白,只知道是内嵌的tomcat找jsp时默认不读取resources目录,但是具体的默认读取的是哪个目录,打了一下午断点我也没找到.... 修改方式,添加配置修改tomcat的读取目录 ...

  4. 阿里Java开发手册学习 2 异常日志

    异常日志 异常处理 1.不要捕获继承自RuntimeException的运行时异常类,这类异常通常由程序员来校验,来保证查询的健壮性. 2. 不要对大段代码 try catch,分清稳定代码和非稳定代 ...

  5. unity导出android项目

    1. 2 . 3 选择Google Android Project(若不选则直接导出Apk) Export,Android项目即可导出成功.

  6. 服务化之Netty

    关于Netty的介绍可参考:https://www.zhihu.com/question/24322387 Netty官网为:http://netty.io/ Git:https://github.c ...

  7. vue组件挂载到全局方法

    在最近的项目中,使用了bootstrap-vue来开发,然而在实际的开发过程中却发现这个UI提供的组件并不能打到我们预期的效果,像alert.modal等组件每个页面引入就得重复引入,并不像eleme ...

  8. sendevent是使用

    按下: sendevent /dev/input/event4 1 254 1 sendevent /dev/input/event4 0 0 0 松开: sendevent /dev/input/e ...

  9. return;测试

    一 没有return;,则会顺序执行到最后 <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q ...

  10. 利用Trigger完成WPF 的动画-渐显

    其实渐显很简单,就是改变控件的透明度. WPF提供了Trigger这个东西. 下面是动画代码:   1 2 3 4 5 6 7 8 9 10 11 12 13 <Style x:Key=&quo ...