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 ...
随机推荐
- 侧边打赏-html
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...
- jni集成第3方third party动态库libwebrtc_audio_preprocessing.so时android.mk的编写
现在要调用一个第3方库libwebrtc_audio_preprocessing.so 最终布局如下: 即创建2个文件夹,将第3方库放进去. include目录放第3方库的头文件 其中lib目录如下 ...
- linux的su和sudo(转载)
来源:http://www.jb51.net/LINUXjishu/12713.html 一. 使用 su 命令临时切换用户身份 1.su 的适用条件和威力 su命令就是切换用户的工具,怎么理解呢?比 ...
- 第 2 章 第 2 题 找" 重数/漏数 "问题 位向量实现
问题分析 输入:一个包含了4 300 000 000个32位整数的文件( 其中可能有重复出现的数字 ) 输出:一个在这个文件中重复出现过了的数字 约束:无 解答思路 第一章中,我们学习了如何用位向量进 ...
- LeetCode(82)题解: Remove Duplicates from Sorted List II
https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/ 题目: Given a sorted linked list, ...
- android DownloadManager.getInputStream返回null的一种情况
将下载操作的代码放到一个新的子线程中来执行.
- Hadoop实战-MapReduce之WordCount(五)
环境介绍: 主服务器ip:192.168.80.128(master) NameNode SecondaryNameNode ResourceManager 从服务器ip:192.168.80.1 ...
- 使用Swift开发iOS项目、UI创建、方法调用
//1.root控制器的创建 var rootCtrl =RootViewController() var root:UINavigationController =UIN ...
- SOAP Only Authentication Using C#
Jason Lattimer's Blog Monday, February 9, 2015 SOAP Only Authentication ...
- 查询所有联系人并选中显示 contentprovider
<!-- 读取联系人记录的权限 --> <uses-permission android:name="android.permission.READ_CONTACTS&qu ...