2008-12-05 25 views
7

Nếu tôi có một NSString với một tập tin văn bản trong nó, làm thế nào để có được một NSArray của NSString với mỗi NSString có chứa một dòng của tập tin.Tôi làm cách nào để có được mỗi dòng từ một NSString?

Trong 10,5 Tôi đã làm điều này:

NSArray* lines = [str componentsSeparatedByCharactersInSet: [NSCharacterSet newlineCharacterSet]]; 

Nhưng điều đó không làm việc trong 10,4, và chương trình của tôi cần phải làm việc trong 10.4.

Đồng thời, nó cần phải hoạt động với \ r, \ n và \ r \ n kết thúc dòng.

Trả lời

10

Đoạn mã sau là trực tiếp từ Apple's documentation regarding paragraphs and line breaks:

unsigned length = [string length]; 
unsigned paraStart = 0, paraEnd = 0, contentsEnd = 0; 
NSMutableArray *array = [NSMutableArray array]; 
NSRange currentRange; 
while (paraEnd < length) 
{ 
    [string getParagraphStart:&paraStart end:&paraEnd 
    contentsEnd:&contentsEnd forRange:NSMakeRange(paraEnd, 0)]; 
    currentRange = NSMakeRange(paraStart, contentsEnd - paraStart); 
    [array addObject:[string substringWithRange:currentRange]]; 
} 

Tôi không chắc chắn 100% nếu nó sẽ làm việc với 10,4

+0

Tôi biên dịch mà không có cảnh báo khi mục tiêu được đặt thành 10.4 và hoạt động tốt. Cảm ơn. –

2

Theo NSString class reference, thông báo NSString componentsSeparatedByCharactersInSet: khả dụng trong OS X 10.5 trở lên. Bạn cần sử dụng componentsSeparatedByString :.

+0

Xin lỗi, tôi không cho bạn biết cách thực hiện, lý do giải pháp của bạn không hoạt động ở 10.4. –

3

Trực tiếp từ một dự án của tôi:

NSString * fileContents = [NSString stringWithContentsOfFile:pathToFile encoding:NSUTF8StringEncoding error:nil]; 
NSMutableArray * fileLines = [[NSMutableArray alloc] initWithArray:[fileContents componentsSeparatedByString:@"\r\n"] copyItems: YES]; 

Tôi không chắc làm thế nào để làm cho nó tự động làm việc với bất kỳ loại dòng kết thúc trong 10.4.

5

Trước tiên, tôi sẽ thay thế tất cả "\ r" bằng "\ n", sau đó thay thế tất cả "\ n \ n" bằng "\ n", sau đó thực hiện một thành phầnSeparatedByString: @ "\ n".

+0

Không phải là giải pháp hiệu quả nhất, nhưng +1 là thông minh về nó –

5

liệt kê tất cả các dòng trong một chuỗi sử dụng enumerateLinesUsingBlock:

[yourString enumerateLinesUsingBlock:^(NSString * _Nonnull line, BOOL * _Nonnull stop) { 
    //line 
}]; 

Tuyên bố

- (void)enumerateLinesUsingBlock:(void (^)(NSString *line, 
            BOOL *stop))block 

thông số

block Khối thực hiện cho enumerati trên.

Khối hai đối số:

line Các dòng hiện tại của chuỗi được liệt kê. Dòng chỉ chứa nội dung của dòng, không có các ký tự dòng.

stop Tham chiếu đến giá trị Boolean mà khối có thể sử dụng để dừng điều tra bằng cách đặt * stop = YES; nó không nên chạm * dừng lại nếu không.

Tính khả dụng Có sẵn trong OS 10.6iOS 4.0 và sau đó.

0

Bạn cũng có thể làm enumerateSubstringsInRange: với các tùy chọn NSStringEnumerationByLines và/hoặc NSStringEnumerationByParagraphs.

Lợi ích của việc thực hiện theo cách đó là bạn nhận NSRange của mỗi chuỗi con và cũng có thể đặt phạm vi ban đầu của chuỗi để liệt kê.

[myString enumerateSubstringsInRange:NSMakeRange(0, myString.length) options:NSStringEnumerationByLines | NSStringEnumerationByParagraphs usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) { 

}]; 
Các vấn đề liên quan