在Objective-C中处理大型文本文件的适当方法是什么?假设我需要分别读取每一行,并希望将每一行视为NSString.这样做最有效的方法是什么?
一种解决方案是使用NSString方法:
+ (id)stringWithContentsOfFile:(NSString *)path
encoding:(NSStringEncoding)enc
error:(NSError **)error
Run Code Online (Sandbox Code Playgroud)
然后使用换行符分隔符拆分行,然后遍历数组中的元素.但是,这似乎效率很低.有没有简单的方法将文件视为一个流,枚举每一行,而不是一次只读取它?有点像Java的java.io.BufferedReader.
我正在尝试读取一个给定的文件NSURL并将其加载到一个数组中,其中的项目由换行符分隔\n.
这是我到目前为止的方式:
var possList: NSString? = NSString.stringWithContentsOfURL(filePath.URL) as? NSString
if var list = possList {
list = list.componentsSeparatedByString("\n") as NSString[]
return list
}
else {
//return empty list
}
Run Code Online (Sandbox Code Playgroud)
出于几个原因,我对此并不满意.一,我正在处理从几千字节到几百MB的文件.你可以想象,使用这么大的字符串是缓慢而笨拙的.其次,这会在执行时冻结UI - 再次,不好.
我已经考虑在一个单独的线程中运行此代码,但我一直遇到麻烦,此外,它仍然无法解决处理大字符串的问题.
我想做的是下面的伪代码:
var aStreamReader = new StreamReader(from_file_or_url)
while aStreamReader.hasNextLine == true {
currentline = aStreamReader.nextLine()
list.addItem(currentline)
}
Run Code Online (Sandbox Code Playgroud)
我如何在Swift中实现这一目标?
关于我正在阅读的文件的一些注意事项:所有文件都由短或(\n或255个字符)字符串组成,由或者分隔\r\n.文件的长度范围从~100行到超过5000万行.它们可能包含欧洲字符和/或带重音的字符.
我正在将一个字典(单词列表,而不是类)加载到NSSet中作为NSStrings.然后我重复发送这个消息-containsObject:someNSString.但它总是返回错误.我写了一些代码来测试它:
NSLog(@"Random from dictionary: %@", [dictionary anyObject]);
NSString *test = [NSString stringWithFormat:@"BEMIRED"];
NSLog(@"To match this word: %@", test);
if ([dictionary containsObject:test])
NSLog(@"YES!");
Run Code Online (Sandbox Code Playgroud)
在日志中我得到以下内容:
Random from dictionary: BEMIRED
To match this word: BEMIRED
Run Code Online (Sandbox Code Playgroud)
(我错过了"是的!")
当我尝试使用CFShow(字典)时,我可以看到它实际上包含字符串和所有内容.一个例子:
0 : <CFString 0xc3bd810 [0x1386400]>{contents = "BEMIRED"}
3 : <CFString 0xdf96ef0 [0x1386400]>{contents = "SUBJECTIFIED"}
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗?谢谢!
我需要以"txf"格式解析数据文件.这些文件可能包含1000多个条目.由于格式定义如JSON,我想创建一个像JSON这样的通用解析器,它可以序列化和反序列化txf文件.
与JSON相反,标记没有办法识别对象或数组.如果出现具有相同标记的条目,我们需要将其视为数组.
# 标记对象的开头. $ 标记对象的成员/ 标记对象的结尾以下是示例"txf"文件
#Employees
$LastUpdated=2015-02-01 14:01:00
#Employee
$Id=1
$Name=Employee 01
#Departments
$LastUpdated=2015-02-01 14:01:00
#Department
$Id=1
$Name=Department Name
/Department
/Departments
/Employee
#Employee
/Employee
/Employees
Run Code Online (Sandbox Code Playgroud)
我能够使用NSScanner 创建一个通用的TXF Parser.但随着更多的条目,性能需要更多的调整.
我写了基础对象plist,并将其性能再次与我编写的解析器进行了比较.我的解析器比plist解析器慢大约10倍.
虽然plist文件大小是5倍以上txf并且有更多标记字符,但我觉得有很多优化空间.
我们非常感谢在这方面提供任何帮助.
编辑:包括解析代码
static NSString *const kArray = @"TXFArray";
static NSString *const kBodyText = @"TXFText";
@interface TXFParser ()
/*Temporary variable to hold values of an object*/
@property (nonatomic, strong) NSMutableDictionary *dict;
/*An array to hold the hierarchial …Run Code Online (Sandbox Code Playgroud) 我正在尝试打开一个文件,并从中读取..但我遇到了一些问题.
FILE *libFile = fopen("/Users/pineapple/Desktop/finalproj/test242.txt","r");
char wah[200];
fgets(wah, 200, libFile);
printf("%s test\n", wah);
Run Code Online (Sandbox Code Playgroud)
这打印:\ 377\376N测试而不是我的文件的任何内容.
任何想法为什么?
完整代码:
#import <Cocoa/Cocoa.h>
#import <stdio.h>
int main(int argc, char *argv[])
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
FILE *libFile = fopen("/Users/pineapple/Desktop/finalproj/test242.txt","r");
if(libFile){
char wah[200];
fgets(wah, 200, libFile);
printf("%s test\n", wah);
}
[pool drain];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
test242.txt不包含超过200个字符.
我构建一个Mac应用程序,我有2个问题:
- 我想创建一个文本文件来读取和写入数据.我不知道如何创建文本文件以读取和写入数据.它是否使用struct?
- 我想创建一个XML文件来读取和写入数据.我可以为XML创建结构吗?
你有什么建议吗?提前致谢
我有一个由多个单词组成的文本文件.它们都被新线分开.
我尝试了什么:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"file" ofType:@"txt"];
if (filePath) { // This does trigger, so the file is actually found.
NSArray *arr = [filePath componentsSeparatedByString:@"\n"];
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
NSMutableArray * lines = [[NSMutableArray alloc] initWithArray:[filePath componentsSeparatedByString:@"\n"] copyItems: YES];
Run Code Online (Sandbox Code Playgroud)
这两个似乎都不起作用,因为当我使用NSLog读出行时,我似乎只获得了文件路径.你们有人可以帮忙吗?
lines数组似乎只包含一个对象,即文本文件位置的字符串.
我想要一个数组,其中每个字符串是由纺织品中的一行分隔的字符串.
在Objective-C中逐行读取文件的最简单,最简洁的方法是什么?
如果您认为使用C/C++中的方法更好,请告诉我.
谢谢!
我需要能够将一些相当大的文本文件(100Mb +)导入到面向内存受限的移动设备的应用程序中的CoreData中.每个文件都包含大量小记录,这些记录在添加到数据库之前将被处理.通过许多来源,在文本文件中阅读的推荐方法似乎是:
NSString *stringFromFileAtPath = [[NSString alloc]initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
Run Code Online (Sandbox Code Playgroud)
乍一看,这似乎是一种非常耗费内存的方式来满足我的需求,但考虑到似乎没有其他推荐的方法来阅读文件,我会猜测Apple已经考虑到这一点并做了自己的记忆管理 - 可能只在必要时才从文件中导致数据错误?
如果不是,最好的方法是使用NSStream和NSScanner一次检索和处理一行文本?
如果推荐的方法确实能很好地处理内存,那么下一步通常是:
NSArray *lines = [stringFromFileAtPath componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
Run Code Online (Sandbox Code Playgroud)
如果我使用这种方法,我假设它需要内存中的完整文本文件,所以再次它将是内存密集型.为了节省内存,我最好还是使用NSScanner,或者考虑到移动设备的处理能力有限(当然还有一些较旧的设备)需要永远完成吗?
在此先感谢您提供任何帮助,您可以向我提出这个问题.
戴夫