最近需要解析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. C#注冊表操作汇总

    一.注冊表基本知识 1)       结构 键->项->子项->值项(名称.类型.数据) REG_SZ         字符串 REG_BINARY    二进制 REG_DWORD ...

  2. 基于UDP的一对回射客户/服务器程序

    前言 之前曾经学习过一对回射客户/服务器程序的例子,不过那个是基于TCP协议的.本文将讲解另一对回射客户/服务器程序,该程序基于UDP协议.由于使用的协议不同,因此编写出的程序也有本质上的区别,应将它 ...

  3. 小程序 富文本 的页面展示 json 数据处理 go-echo 为小程序提供feed流服务

    go生成页面 返回给web-view {{define "DBHtmlCode"}} <!DOCTYPE html> <html lang="zh-cm ...

  4. 双端队列篇deque SDUT OJ 双向队列

    双向队列 Time Limit: 1000MS Memory limit: 65536K 题目描述 想想双向链表……双向队列的定义差不多,也就是说一个队列的队尾同时也是队首:两头都可以做出队,入队的操 ...

  5. Appium——连接真机,adb devices获取不到设备号

    连接真机后,使用 adb devices获取不到设备号. 1.检查usb接口是否正常,是否正常链接到电脑 2.手机开发者模式是否开启,usb调试是否开启 3.检查驱动是否正常 4.如果驱动显示黄叹号, ...

  6. MySQL学习笔记(六)—— MySQL自连接

    有的时候我们需要对同一表中的数据进行多次检索,这个时候我们可以使用之前学习过的子查询,先查询出需要的数据,再进行一次检索. 例如:一张products表,有产品id,供应商id(vend_id),产品 ...

  7. Java中锁的内存语义

    我们都知道,Java中的锁可以让临界区互斥执行.锁是Java并发编程中最重要的同步机制,锁除了可以让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息.下面是锁的释放-获取的代码: C ...

  8. LoadRunner中两种录制模式的区别

    决定我们成为什么样人的,不是我们的能力,而是我们的选择. ——<哈利-波特与密室> 一.先看看两种模式的设置和录制脚本的区别 设置HTML录制模式: 设置URL录制模式: HTML脚本: ...

  9. 阿里云数据库产品HybridDB简介——OLAP数据库,支持行列混合存储,基于数据库Greenplum的开源版本,并且吸收PostgreSQL精髓

    为什么会有HybridDB的诞生?它经历了怎样的研发历程?它的应用场景和情况是怎样的?带着这些问题,InfoQ对阿里云的数据库专家兼Postgres中国社区/中国用户会主席萧少聪先生进行了采访,以下文 ...

  10. Local storage htm5

    使用本地存储,web应用可以在用户浏览器中本地存储数据. 在HTML5之前,应用数据存储必须使用cookie,包括每个服务端的请求,本地存储更加安全,并且可以存储大量的数据到本地,不影响网站的性能. ...