Qt解析CSV文件
最近需要解析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文件的更多相关文章
- php解析.csv文件
public function actionImport() { //post请求过来的 $fileName = $_FILES['file']['name']; $fileTmpName = $_F ...
- [cocos2dx utils] cocos2dx读取,解析csv文件
在我们的游戏中,经常需要将策划的数值配置成csv文件,所以解析csv文件就是一个很common的logic, 例如如下csv文件: 下面是一个基于cocos2dx 2.2.4的实现类: #ifndef ...
- .NET 上传并解析CSV文件存库
1.前端: 放置浏览按钮 <div class="row inner_table text-center"> <input id="fileId&quo ...
- java opencsv解析csv文件
记一次使用opencsv解析csv文件时碰到的坑 最近在开发过程中需要解析csv文件,公司用的解析工具是opencsv,在根据opencsv的官方文档去解析时发现csv文件中含有繁体字,使用其自带的C ...
- 解析 csv文件 java ***最爱那水货
/** * csv文件解析 <br> * wx 微信明细数据 第1行是标题 ,最后2行 是总结 提取数据需要过滤<br> * zfb 支付宝明细数据 前4行 和最后4行是总结 ...
- 如何用Java解析CSV文件
首先看一下csv文件的规则: csv(Comma Separate Values)文件即逗号分隔符文件,它是一种文本文件,可以直接以文本打开,以逗号分隔.windows默认用excel打开.它的格式包 ...
- Qt生成CSV 文件
1.CSV 文件 不支持 EXCEL中 的多个工作表的模式. 一个 CVS 文件只能转换成 EXCEL 一个工作表. 2.逗号分隔值(Comma-Separated Values,CSV,有时也称为字 ...
- Qt中csv文件的导入与导出
转自:http://blog.csdn.net/mingxia_sui/article/details/7683030 CSV 1.简介: 全称:Comma Separated Values. 是“逗 ...
- 初识---Qt解析XML文件(QDomDocument)
关于XML及其使用场景不在此多做介绍,今天主要介绍Qt中对于XML的解析.QtXml模块提供了一个读写XML文件的流,解析方法包含DOM和SAX,两者的区别是什么呢? DOM(Document Ob ...
随机推荐
- Excel表格数据导入Mysql数据库的方法
1.使用Navicat 连接需要导入的数据库. 2.excel 列的名字最好和数据库的名字一致,便于我们直观的查看好理解. 第一步,先创建好表,和准备好对应的excel文件.在Navicat 中选 ...
- 02 php生成xml数据
<?php class Response_xml{ /** *按xml方式输出通信 *@param integet $code 状态码 *@param string $message 提示信息 ...
- VLC RTP Over TCP
在RTSP协议请求数据时,让VLC以TCP的方式获取服务器发来的RTP数据 不为别的,下次回复直接用博客链接就能回复大家了! 操作:工具 -> 首选项 然后: 搞定! ------------- ...
- 九度OJ 1135:字符串排序 (排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1559 解决:807 题目描述: 先输入你要输入的字符串的个数.然后换行输入该组字符串.每个字符串以回车结束,每个字符串少于一百个字符. 如 ...
- tornado之表单和模板
之前在indexHandler中通过self.write()方法在对应的网页中写入具体的字符信息. 如果我们想直接返回一个网页那么这个时候就需要用到模板了 首先在工程目录下新建一个template文件 ...
- iOS 设备获取唯一标识符汇总
在2013年3月21日苹果已经通知开发者,从2013年5月1日起,访问UIDID的应用将不再能通过审核,替代的方案是开发者应该使用“在iOS 6中介绍的Vendor或Advertising标示符”. ...
- Promise 源码分析
前言 then/promise项目是基于Promises/A+标准实现的Promise库,从这个项目当中,我们来看Promise的原理是什么,它是如何做到的,从而更加熟悉Promise 分析 从ind ...
- -webkit-mask-box-image给框架加个同样大小的遮罩
很棒的css属性,可以在div上方建个同大小的遮罩,配合线性变化gradient可以实现很酷的样式,比如:时间选择的UI组件,里面有个模糊的上方遮罩 手册地址:https://developer.mo ...
- Zookeeper实现负载均衡原理
先玩个正常的,好玩的socket编程: 服务端: 首先公共的这个Handler: package com.toov5.zkDubbo; import java.io.BufferedReader; i ...
- Relocation POJ-2923
题目链接 题目意思: 有 n 个货物,并且知道了每个货物的重量,每次用载重量分别为c1,c2的火车装载,问最少需要运送多少次可以将货物运完. 分析:本题可以用二进制枚举所有不冲突的方案,再来dp 一下 ...