Цитата(AD @ 7.10.2010, 9:09)
Думаю, что может пригодиться. Подчиненная создала парсер CSV файлов на Qt. Есть просто некоторая добавка, которая может быть полезна и другим. В CSV файле можно делать однострочные комментарии с помощью символа // и многострочные комментарии с помощью /* */. Вот код:
Ага всё бы ничего да вот только он не умеет нормально парсить в соответствии с документацией (
http://ru.wikipedia.org/wiki/CSV )!!!
Весь инет прогуглил, так и не нашел правильного, пришлось самому кодить, держите кому надо:
#ifndef CSVREADER_H
#define CSVREADER_H
#include <QObject>
#include <QString>
#include <QStringList>
#include <QFile>
class QTextStream;
// Класс чтения входных CSV-файлов
class CsvReader: public QObject
{
Q_OBJECT
private:
QFile _file; // ucxoдный CSV-фaйл
QChar _separator; // разделитель, по которому определяется разбивка на колонки
QList<QStringList> _lines_list; // массив полученный в результате разбора CSV-файла
public:
CsvReader(QObject *parent = 0, const QString& file_name = QString(""));
~CsvReader();
void setFileName(const QString& name) { _file.setFileName(name); } // ycmaнoвka имени файла
bool Open(); // omkpыmue файла
QList<QStringList> CSVRead(); // разбор файла
void close() { if(isOpen()) _file.close(); } // зakpыmue файла
bool isOpen() const { return _file.isOpen(); } // npoвepka открытия файла
};
#endif // CSVREADER_H
#include "csvreader.h"
#include <QTextStream>
CsvReader::CsvReader(QObject *parent, const QString& file_name): QObject(parent), _file(file_name), _separator(';')
{ }
CsvReader::~CsvReader()
{
close();
}
bool CsvReader::Open(){
if(!_file.open(QIODevice::ReadOnly | QIODevice::Text)){
return false;
}else
return true;
}
//чистка значения
QString trimCSV(QString item){
if((!item.isEmpty())&&(item[0] == QChar(34)))
item.remove(0,1);
if((!item.isEmpty())&&(!item.isNull())&(item[item.count()-1] == QChar(34)))
item.remove(item.count()-1,1);
if(!item.isEmpty())
item = item.replace("\"\"","\"");
return item;
}
//Paзбop файла
//в соответствии со спецификацией, подробнее: http://ru.wikipedia.org/wiki/CSV
QList<QStringList> CsvReader::CSVRead()
{
if (_file.isOpen()){
bool Quote = false;
QList<QString> ItemList;
QString item = "";
QTextStream out(&_file);
while(!out.atEnd()){
QString line(out.readLine().simplified());
int count = line.count();
for (int i = 0;i<count;i++){
if (line[i] == QChar(34)){
Quote = (Quote) ? false : true;
}
if ((Quote != true)&(line[i] == _separator)){
ItemList.append(trimCSV(item));
item = "";
}else{
item += line[i];
}
if ((count-1 == i)&(Quote != true)){
item = trimCSV(item);
if (item != "")
ItemList.append(item);
_lines_list.append(ItemList);
ItemList.clear();
item = "";
}
}
}
}
close();
return _lines_list;
}
CsvReader *csv = new CsvReader(0,"C:/1.csv"); //
if (csv->Open()){
QList<QStringList> str = csv->CSVRead();
qDebug() << str;
}