2011-02-08 9 views
3

나는 쉼표 (,)에 따라 문자열을 나눌 거대한 텍스트 파일을 읽고 배열에 문자열을 저장하려고합니다. 그렇게하는 법. badaOS에서와 같이 StringTokenizer로 작업을 수행하는 클래스가 있습니까? QFile 시도했지만 전체 파일을 읽을 수 없습니다.Qt에서 텍스트 파일 읽기

+0

당신이 사용을 고려 했나 내가 1600 선 파일이 테스트하고 Qt를 잘 그것을 처리 할 듯 [표준 : : 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를 지원하는 OS가 있습니까? VMS는 그것들을 가지고 있지만 Qt를 지원하지는 않습니다. Unix, Linux 및 Windows에서 "텍스트"는 일반 파일의 특수 해석 일뿐입니다. – MSalters

+4

@MSalters, QDataStream은 문자열에 대해 연산자 '를 오버로드하지 않았습니다. 대답의 코드는 컴파일되지 않습니다. –

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_appropriate_number)로 읽을 수 있고 file.atEnd()는 false입니다.

청크 (file.read() 포함)를 읽고 임시 문자열 버퍼에 추가하고 ','(예 : QString의 contains() 메소드 사용)을 검색하십시오. ','가 포함 된 경우 QString의 split() 메서드로 분할합니다. 첫 번째 X 부분 (읽은 1000 자에 1 개 이상의 토큰이 포함될 수 있음)에 발견 된 토큰이 포함되며 마지막 토큰은 아직 완전한 토큰이 아닙니다. 따라서 임시 문자열을 분할의 마지막 부분으로 전환하고 다른 청크를 읽습니다 (file.atEnd()를 누를 때까지) 임시 문자열 버퍼에 추가하십시오. 토큰이 거대하지 않은 한 효율적으로 작동합니다. 그리고 마지막으로 버퍼링 된 텍스트를 처리 한 후에 file.atEnd()를 처리하는 것을 잊지 마십시오.

또는 문자를 기준으로 파일을 읽고 ','를 수동으로 확인할 수 있지만 항상 그렇습니다 1 문자 이상을 읽는 것이 더 좋습니다 (더 많이 읽는다면 더 효율적입니다).

0

쉼표 뒤에 공백을 캡처하지 않습니다. 만족스럽지 않으면 정규식을 최적화하십시오. 또한 상단의 포함 금액을 줄일 수도 있습니다. 나는 철저히 조사 중이었습니다. 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; 
}