crossplatform.ru

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


  Ответ в Парсер CSV файла
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
AD Дата 29.10.2012, 12:00
 
Цитата(D_K @ 20.10.2012, 16:56) *
AD, ошибка в том, что представленные тут парсеры парсят не csv-файлы, а некоторый свой формат, похожий на csv :)
На csv же есть спецификация.

Так убрать эти комментарии и он все выполняет! ;)
D_K Дата 20.10.2012, 15:56
  AD, ошибка в том, что представленные тут парсеры парсят не csv-файлы, а некоторый свой формат, похожий на csv :)
На csv же есть спецификация.
AD Дата 20.9.2012, 13:54
 
Цитата(Dmitry_rk @ 6.6.2012, 21:32) *
Оба парсера из этой не соответствуют спецификации и не могут распарсить 100% валидный CSV

Еще раз спрошу... дело в распарсивании комментариев // и /* */? Так это специально было сделано. Сразу же об этом и оговорился в первом же посте. В чем еще ошибки?
Dmitry_rk Дата 6.6.2012, 20:32
  Оба парсера из этой не соответствуют спецификации и не могут распарсить 100% валидный CSV
AD Дата 20.5.2012, 17:46
  Ау. Есть кто-нибудь из тех, кто использовал выложенный тут парсер? Так в чем недочет-то?
AD Дата 11.4.2012, 9:58
  Так и не понял, в чем некорректность моего парсера. То, что он пропускает специфичные комментарии - это специально сделано.
AD Дата 15.2.2012, 9:58
 
Цитата(vasilij-lavrov @ 18.6.2011, 15:57) *
Ага всё бы ничего да вот только он не умеет нормально парсить в соответствии с документацией ( http://ru.wikipedia.org/wiki/CSV )!!!

Спасибо за свой вариант. А в чем проявляется некорректность парсера, выложенного мной? В твоем коде не разбирался, просто посмотрел. Словами можешь описать? Заранее спасибо. Может смогу корректно исправить парсинг.
vasilij-lavrov Дата 1.12.2011, 14:24
 
Цитата(PAFOS @ 1.12.2011, 15:03) *
почему-то проигнорировали регулярки... там вашпе одной функцией можно было бы обойтись...

Ну, а что сам не сделал, сделал бы да для людей выложил.
PAFOS Дата 1.12.2011, 14:03
  почему-то проигнорировали регулярки... там вашпе одной функцией можно было бы обойтись...
Гость Дата 1.12.2011, 12:35
 
Цитата(vasilij-lavrov @ 18.6.2011, 14:57) *
Цитата(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


Цитата(vasilij-lavrov @ 18.6.2011, 14:57) *
держите кому надо

Спасибо большое.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 17:57