2011-07-17 78 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); 

然后我用这个列举行

这样你就可以很容易地找到你要找的号码。

也许有更好的方法,但这个工程。