适用于:对于小型数据量的CSV文件。
优点:
缺点:
//读取CSV文件
先使用readLine读取每行数据,再使用split进行分割,得到QStringList 数据。
bool readCsv(QString filePath, QList& data)
{
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return false;
QTextStream stream(&file);
while (!stream.atEnd())
{
QString line = stream.readLine();
QStringList row = line.split(',', Qt::SkipEmptyParts);
data.append(row);
}
file.close();
return true;
}
/写入CSV文件
使用<<运算符进行写操作,并写入分隔符“,”和换行符“\n”。
bool writeCsv(QString filePath, QList& data)
{
QFile file(filePath);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return false;
QTextStream stream(&file);
for (int i = 0; i < data.size(); i++)
{
QStringList row = data.at(i);
for (int j = 0; j < row.size(); j++)
{
stream << row.at(j);
if (j < row.size() - 1)
stream << ",";
}
stream << "\n";
}
file.close();
return true;
}
本方法使用QTextCodec来处理编码问题,并使用QByteArray来读写文件。
适用于大数据量。
优点:
缺点:
实现复杂:相对于第一种实现方式,该方法需要处理编码问题和字节流转换问题,因此实现方式相对复杂一些。
/读取CSV文件
直接使用readAll一次性读取整个csv文件,先按换行符“\n”进行分割,再按分隔符“,”进行分割。同时注意文件编码,使用UTF-8。
bool readCsv(QString filePath, QList& data)
{
QFile file(filePath);
if (!file.open(QIODevice::ReadOnly))
return false;
QTextCodec* codec = QTextCodec::codecForName("UTF-8"); // 使用UTF-8编码
QByteArray content = file.readAll();
QString text = codec->toUnicode(content);
QStringList lines = text.split('\n');
for (int i = 0; i < lines.size(); i++)
{
if (!lines.at(i).isEmpty())
{
QStringList row = lines.at(i).split(',');
data.append(row);
}
}
file.close();
return true;
}
/写入CSV文件
使用join函数把QStringList加上分隔符“,”合并成 QString.再加上换行符“\n” .
使用write函数进行写操作。
bool writeCsv(QString filePath, QList& data)
{
QFile file(filePath);
if (!file.open(QIODevice::WriteOnly))
return false;
QTextCodec* codec = QTextCodec::codecForName("UTF-8"); // 使用UTF-8编码
for (int i = 0; i < data.size(); i++)
{
QStringList row = data.at(i);
QString line = row.join(",");
line += "\n";
QByteArray encodedLine = codec->fromUnicode(line);
file.write(encodedLine);
}
file.close();
return true;
}