crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 10.7.2025, 0:51