相关疑难解决方法(0)

Objective-C:逐行读取文件

在Objective-C中处理大型文本文件的适当方法是什么?假设我需要分别读取每一行,并希望将每一行视为NSString.这样做最有效的方法是什么?

一种解决方案是使用NSString方法:

+ (id)stringWithContentsOfFile:(NSString *)path 
      encoding:(NSStringEncoding)enc 
      error:(NSError **)error 
Run Code Online (Sandbox Code Playgroud)

然后使用换行符分隔符拆分行,然后遍历数组中的元素.但是,这似乎效率很低.有没有简单的方法将文件视为一个流,枚举每一行,而不是一次只读取它?有点像Java的java.io.BufferedReader.

file-io objective-c enumerate nsstring nsstream

138
推荐指数
8
解决办法
15万
查看次数

在Swift中逐行读取文件/ URL

我正在尝试读取一个给定的文件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万行.它们可能包含欧洲字符和/或带重音的字符.

macos file input stream swift

72
推荐指数
3
解决办法
4万
查看次数

NSSet with NSStrings containsstObject在应该返回YES时不返回YES

我正在将一个字典(单词列表,而不是类)加载到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)

有人可以帮我吗?谢谢!

objective-c nsstring nsset

13
推荐指数
1
解决办法
7955
查看次数

优化字符串解析

我需要以"txf"格式解析数据文件.这些文件可能包含1000多个条目.由于格式定义如JSON,我想创建一个像JSON这样的通用解析器,它可以序列化和反序列化txf文件.

与JSON相反,标记没有办法识别对象或数组.如果出现具有相同标记的条目,我们需要将其视为数组.

  1. # 标记对象的开头.
  2. $ 标记对象的成员
  3. / 标记对象的结尾

以下是示例"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)

markup parsing objective-c ios nsscanner

9
推荐指数
1
解决办法
854
查看次数

打开文件并从文件Objective-c中读取

我正在尝试打开一个文件,并从中读取..但我遇到了一些问题.

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个字符.

objective-c fgets

6
推荐指数
2
解决办法
2万
查看次数

Objective C - 创建文本文件,在Cocoa中逐行读写

我构建一个Mac应用程序,我有2个问题:

  1. 我想创建一个文本文件来读取和写入数据.我不知道如何创建文本文件以读取和写入数据.它是否使用struct?
  2. 我想创建一个XML文件来读取和写入数据.我可以为XML创建结构吗?

你有什么建议吗?提前致谢

cocoa objective-c text-files xml-parsing

6
推荐指数
2
解决办法
4万
查看次数

从objective-c中的文本文件中读取

我有一个由多个单词组成的文本文件.它们都被新线分开.

我尝试了什么:

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数组似乎只包含一个对象,即文本文件位置的字符串.

我想要一个数组,其中每个字符串是由纺织品中的一行分隔的字符串.

cocoa-touch objective-c ios

2
推荐指数
1
解决办法
7825
查看次数

如何在objective-c中以最少的行数在objective-c中逐行读取文件

在Objective-C中逐行读取文件的最简单,最简洁的方法是什么?

如果您认为使用C/C++中的方法更好,请告诉我.

谢谢!

file objective-c handle

1
推荐指数
1
解决办法
4675
查看次数

如何在不使用大量内存的情况下导入包含Objective-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,或者考虑到移动设备的处理能力有限(当然还有一些较旧的设备)需要永远完成吗?

在此先感谢您提供任何帮助,您可以向我提出这个问题.

戴夫

core-data objective-c ios

0
推荐指数
1
解决办法
2382
查看次数