最近需要解析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. node开发后将本地mysql数据导入到服务器mysql

    近期写的一个钉钉企业微应用用到了mysql数据库(用koa写的后台,并用mysql库来连接),现在需要把本地数据库的数据导入到服务器的数据库中. 服务器安装mysql 可以google篇centos的 ...

  2. elk 日志分析系统Logstash+ElasticSearch+Kibana4

    elk 日志分析系统 Logstash+ElasticSearch+Kibana4 logstash 管理日志和事件的工具 ElasticSearch 搜索 Kibana4 功能强大的数据显示clie ...

  3. postgresql的show databases、show tables、describe table操作

    1.相当与mysql的show databases; select datname from pg_database; 2.相当于mysql的show tables; SELECT table_nam ...

  4. IOS开发之Iphone和Ipad应用程序图标和启动动画

    本文转载至 http://blog.csdn.net/yesjava/article/details/8782060 当我们用xcode开发iphone和ipad应用程序的时候,我们可以用一下表中所显 ...

  5. hdu5258简单枚举

    百度之星复赛第一题.不明白这么水的题为何一堆人没过...这些人是咋晋级复赛的呢... /* * Author : ben */ #include <cstdio> #include < ...

  6. Two-Factor Authentication 2FA

    About two-factor authentication - User Documentation https://help.github.com/articles/about-two-fact ...

  7. 我对Swift的几点疑问

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/caowenbin/article/details/31418773         Swift自问世 ...

  8. Boost智能指针——scoped_ptr

    boost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放. 上一段代码,以及其输出: #include <string ...

  9. Docker容器的网络连接:

    yw1989@ubuntu:~$ ifconfig docker0 Link encap:Ethernet HWaddr 02:42:97:61:42:9f inet addr:172.17.0.1 ...

  10. 追求代码质量: 用 AOP 进行防御性编程

    原文出处: IBM中国 开发人员测试的主要缺点是:绝大部分测试都是在理想的场景中进行的.在这些情况下并不会出现缺陷 —— 能导致出现问题的往往是那些边界情况. 什么是边界情况呢?比方说,把 null  ...