crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

История благодарностей участнику vasilij-lavrov ::: Спасибо сказали: 2 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
18.6.2011, 14:57 Парсер CSV файла
Цитата(AD @ 7.10.2010, 9:09) *
Думаю, что может пригодиться. Подчиненная создала парсер CSV файлов на Qt. Есть просто некоторая добавка, которая может быть полезна и другим. В CSV файле можно делать однострочные комментарии с помощью символа // и многострочные комментарии с помощью /* */. Вот код:

Ага всё бы ничего да вот только он не умеет нормально парсить в соответствии с документацией ( http://ru.wikipedia.org/wiki/CSV )!!!
Весь инет прогуглил, так и не нашел правильного, пришлось самому кодить, держите кому надо:
h-file
#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
cpp-file
#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;
    }

Сайт автора: http://www.Baksik.ru
AD, IndyStar,

RSS Текстовая версия Сейчас: 8.4.2020, 18:15