2011-02-08 4 views
3

Я хочу прочитать огромный текстовый файл, в котором я буду делить строки в соответствии с запятой (,) и хранить строки в массиве. Итак, как это сделать. Есть ли какой-либо класс, который выполняет действие как StringTokenizer, как в badaOS. Я попытался QFile, но не смог прочитать весь файл.Чтение текстового файла в Qt

+0

ли вы рассмотреть вопрос об использовании [станд :: ifstream] (http://www.cplusplus.com/reference/iostream/ ifstream /)? – Oswald

+0

Не читать весь файл сразу, читать его по строке –

+2

Имеет ли этот огромный файл чрезвычайно длинные строки? Если нет, QTextStream :: readLine() и QString :: split() помогут вам. –

ответ

1

Вы можете использовать файловые потоки.

QFile file = new QFile(hugeFile);  
file.open(QIODevice.OpenModeFlag.ReadOnly);  
QDataStream inputStream = new QDataStream(file); 
QStringList array; 
QString temp; 

while(!inputStream.atEnd()) { 
    inputStream >> temp; 
    array << temp.split(";"); 
} 

Обратите внимание, что это непроверенный (псевдо) код, надеюсь, что это поможет.

+2

QDataStream не будет работать с текстовыми файлами. –

+0

Что значит «не сработает»? Есть ли какая-либо ОС с истинными текстовыми файлами, а также поддерживает Qt? VMS имеет их, но не поддерживает Qt. В Unix, Linux и Windows «текст» - это просто специальная интерпретация обычных файлов. – MSalters

+4

@MSalters, QDataStream просто не перегружает 'operator >>' для строк. Код в ответе даже не компилируется. –

10

QTextStream позволяет читать построчно

QFile file(hugeFile); 
QStringList strings; 
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) 
{ 
    QTextStream in(&file); 
    while (!in.atEnd()) { 
     strings += in.readLine().split(";"); 
    } 
} 
+2

Хорошее решение, но, как я уже упоминал ранее, это не сработает, если есть огромные линии или нет разделителей строк вообще. Я также задаюсь вопросом, почему оба ответа используют «;» в примерах, когда упоминается вопрос «,». –

+0

Использование ";" как разделитель _de facto_ – Henrikki

0

Вы всегда можете прочитать часть файла:

QFile file(...); 
file.read(1000); // reads no more than 1000 bytes 

Или автомобиль прочитать Ваш файл построчно:

file.readLine(); 

, но вам придется обрабатывать случаи, когда одна строка была разделена на две части.

0

Если это действительно огромный файл, вы можете прочитать файл file.read (an_appro_number), а file.atEnd() - false.

Прочитайте фрагмент (с файлом file.read()), добавьте его во временный буфер строки и найдите «,» (например, с помощью метода QString contains()). Если он содержит ',', то разделите его (с помощью метода QString split()): первые части X (1000 символов могут содержать более 1 токенов) будут содержать найденные маркеры, а последний еще не является полным маркером. Поэтому переключите временную строку на последнюю часть раскола и прочитайте еще один фрагмент (пока вы не нажмете file.atEnd()) и добавите его во временный буфер. Это будет работать эффективно, если ваши жетоны не будут огромными. И не забудьте обработать последний буферный текст после того, как вы нажмете file.atEnd() :)

Или в качестве альтернативы вы можете прочитать файл по символу и проверить «,» вручную, но это всегда лучше читать более 1 символа (это более эффективно, если вы читаете больше).

0

Это не будет захватывать пробелы после запятой. Если это неприемлемо, не стесняйтесь оптимизировать регулярное выражение. Вероятно, вы также можете уменьшить количество включений в верхней части. Я просто был доволен. Я испытал это на файл в 1600 линии, и, казалось, справиться с этим хорошо в Qt 5,6

#include <QCoreApplication> 
#include <QFile> 
#include <QIODevice> 
#include <QRegularExpression> 
#include <QRegularExpressionMatch> 
#include <QRegularExpressionMatchIterator> 
#include <QString> 
#include <QStringList> 
#include <QTextStream> 

int main(int argc, char * argv[]) 
{ 
    QCoreApplication app(argc, argv); 

    QFile file("C:\\PathToFile\\bigFile.fileExt"); 
    QStringList lines; 
    QStringList matches; 
    QString match; 

    file.open(QIODevice::ReadOnly | QIODevice::Text); 
    while(!file.atEnd()) 
    { 
     lines << file.readLine(); 
    } 
    file.close(); 

    QRegularExpression regex("(^|\\s|,)\\K\\w.*?(?=(,|$))"); 
    QRegularExpressionMatchIterator it; 

    foreach (QString element, lines) 
    { 
     it = regex.globalMatch(element); 

     while(it.hasNext()) 
     { 
      QRegularExpressionMatch qre_match = it.next(); 
      match = qre_match.captured(0); 
      matches << match; 
     } 
    } 

    return 0; 
} 
Смежные вопросы