2011-07-17 35 views
2

希望有人能指出我在正確的方向尋找如何從一個巨大的XML文件(50K +線)讀取給定的行號?如何讀取objective-c文件中的特定行號?

+0

也許多一些信息會有幫助,你是否匹配模式 –

+0

重複12行模式,但每行是不同的長度(一些非常長)。實現了DDFileReader逐行閱讀器,但需要iPhone將近90秒才能解析並找到我正在查找的信息。我已經創建了一個索引文件,提供了行號 - 但不太確定如何抓住這些行... – capikaw

回答

1

由於XML文件中的行通常不具有固定的長度,因此無法確定文件中第n行開始的位置。你必須從頭開始閱讀,並計算行數,直到找到你想要的。

如果您要頻繁訪問此文件,您可能想要做的一件事就是爲該文件構建一個索引。掃描文件並將每行起始處的文件偏移量寫入索引文件。由於這些偏移量都具有相同的大小,並且由於每行都有一個偏移量,因此可以通過讀取索引文件中的第n個偏移量來找到數據文件第n行的偏移量。

+0

感謝迦勒 - 絕對確認我是這樣做的正確方法。我基本上創建了一個索引文件,通過緩慢地迭代我的主索引文件,然後吐出偏移的開始和結束。我保存了開始和結束索引(而不是行號)。現在,我只是像這樣使用NSFileHandle:[fileHandle seekToFileOffset:offsetStart]; NSString * kmlChunk = [[NSString alloc] initWithData:[fileHandle readDataOfLength:(offsetEnd-offsetStart)] encoding:NSUTF8StringEncoding]; – capikaw

0

我就是這麼做的:

我第一次加載該文件在內存中(50K +線是大,但有可能):

__block NSUInteger currentLineNum = 1; 

[fileAsString enumerateLinesUsingBlock: 
    ^(NSString *line, BOOL *stop) 
    { 

     // Handle line here... 

     currentLineNum++; 
    }]; 

// Load file as single string. 
// NSISOLatin1StringEncoding works most of the time. 
// Use other encoding if necessary. 
NSStringEncoding encoding = NSISOLatin1StringEncoding; 
NSError *error = nil; 

NSString *fileAsString = [NSString stringWithContentsOfFile: path 
            encoding: encoding 
            error: &error]; 

if (error != nil) 
    NSLog(@"%@", error); 

然後我用這個列舉行

這樣你就可以很容易地找到你要找的號碼。

也許有更好的方法,但這個工程。