2010-07-27 29 views

Trả lời

50

cuối cùng tôi nhận được xung quanh để dọn dẹp một phân tích cú pháp tôi đã có trong thư mục mã của tôi và đăng nó trên Github: http://github.com/davedelong/CHCSVParser

Nó khá kỹ lưỡng. Nó xử lý tất cả các loại lược đồ thoát, dòng mới trong các trường, nhận xét, v.v. Nó cũng sử dụng tải tệp thông minh, có nghĩa là bạn có thể phân tích an toàn các tệp lớn trong các điều kiện bộ nhớ bị hạn chế.

+0

Tôi đã kiểm tra liên kết Github mà bạn đã đưa ra như vậy có vẻ tốt nhưng khi tôi đã thử nghiệm nó trong giả lập iPhone sau đó nó không có vẻ làm việc. Trình mô phỏng không mở. Ngoài ra, SDK cơ sở đã được đặt thành Mac OS X 10.5. Vì vậy, điều này sẽ không làm việc cho iPhone? Cần làm gì? Cảm ơn. :) –

+1

@PARTH có một danh sách các tệp trong phần sử dụng chung của readme. Sao chép chúng vào dự án của bạn và '#import 'CHCSV.h" ' –

+0

Cảm ơn Dave đã trả lời câu hỏi ngớ ngẩn của tôi :) Ngoài ra tôi cho rằng chúng ta phải sử dụng phương thức arrayWithContentsofCSVFile:. đúng? –

8

cách nhanh để làm điều này:

NSString *dataStr = [NSString stringWithContentsOfFile:@"example.csv" encoding:NSUTF8StringEncoding error:nil];
NSArray *array = [dataStr componentsSeparatedByString: @","];

+1

Điều này sẽ không xử lý các khối chứa, mặc dù đó là lý do tại sao bạn thường cần một thư viện chính thức :) – willcodejavaforfood

+0

không phải những gì tôi cần hôm nay, nhưng tốt để biết về phương pháp/thư đó (?) –

0

tôi đã tìm thấy ParseKit vài tuần trước Nhưng IMHO cho hầu hết các trường hợp -[NSString componentsSeparatedByString:] phương pháp và NSScanner là quá đủ và khá dễ sử dụng.

+0

cảm ơn, trông hơi phức tạp cho những gì tôi đang tìm kiếm. –

3

Tôi đã viết một trình phân tích cú pháp CSV đơn giản (mặc dù không đầy đủ tính năng) cho một dự án mà tôi đang làm việc trên: CSVFile.hCSVFile.m. Hãy lấy nó - mã có sẵn theo GPLv3 (thật không may, nó là một yêu cầu cho dự án mà tôi đang làm việc) nhưng tôi rất sẵn lòng cấp phép cho bạn theo giấy phép MIT hoặc giấy phép khác.

1

Điều này có vẻ là toàn diện nhất mà tôi đã tìm thấy cho đến nay.

http://www.macresearch.org/cocoa-scientists-part-xxvi-parsing-csv-data

Là một mặt lưu ý, bạn sẽ nghĩ ngôn ngữ chính nhất (Delphi, C#, Objective-C, php vv) sẽ có một thư viện có sẵn với một thực hiện đầy đủ các định dạng trao đổi dữ liệu cơ bản này.

Tôi biết json là tuyệt vời và XML là đáng tin cậy nhưng không có sẵn dưới dạng tùy chọn lưu từ hầu hết các ứng dụng lưu dữ liệu bảng. CSV vẫn là.

-2

Như xmr đã nói ở trên: Có thể trong Mục tiêu C để chuyển đổi csv NSString thành 'các thành phần được phân tách bằng mảng'.

NSArray* items; 
    items=[bufferString componentsSeparatedByString:@","];  

Trong trường hợp bạn quan tâm đến việc xuất csv đã đến chủ đề này - như tôi đã làm - dưới đây là trích xuất cách tôi xuất tệp csv.

NSString* fileName = @"Level"; 
    fileName = [fileName stringByAppendingString:levelNumberBeingEdited]; 
    fileName = [fileName stringByAppendingString:@".txt"]; 
    NSString* [email protected]""; 

Chuỗi đệm được điền bằng cách lặp qua từng mục dữ liệu (không được hiển thị) và chèn dấu phẩy giữa mỗi mục. Cuối cùng nó được xuất khẩu.

NSString* homeDir = NSHomeDirectory(); 
    NSString* fullPath = [homeDir stringByAppendingPathComponent:fileName]; 
    NSError* error = nil; 
    [bufferString writeToFile:fullPath atomically:NO encoding:NSASCIIStringEncoding error:&error]; 
+7

-1 bất kể đây là gì, đó không phải là câu trả lời về cách phân tích cú pháp tệp CSV. Đã gắn cờ. –

+1

Tôi đã chỉnh sửa câu trả lời của mình. Tôi đã được dẫn đến chủ đề này và xmr giải quyết vấn đề của tôi. Tôi nghĩ rằng sẽ hữu ích khi cho thấy tệp văn bản csv thực tế phù hợp với giải pháp của anh ấy như thế nào. –

5

Vâng, trên các giải pháp đơn giản không tính đến nhiều bản ghi. Sử dụng đoạn mã sau đọc một mặc định vượt trội CSV sử dụng ASCI 13 như đánh dấu dòng cuối:

NSString *content = [NSString stringWithContentsOfFile:filepath encoding:NSUTF8StringEncoding error:nil]; 
NSArray *contentArray = [content componentsSeparatedByString:@"\r"]; // CSV ends with ACSI 13 CR (if stored on a Mac Excel 2008) 

for (NSString *item in contentArray) { 
    NSArray *itemArray = [item componentsSeparatedByString:@";"]; 
    // log first item 
    NSLog(@"%@",[itemArray objectAtIndex:0]); 
} 
+0

bạn phải xem xét rằng trong khi điều này có thể làm việc cho các tệp đơn giản, nó sẽ không hoạt động trong nhiều trường hợp. Có những trường hợp bạn có thể thoát khỏi dấu phẩy hoặc khi bạn đặt giá trị bên trong dấu ngoặc kép. componentsSeparatedByString sẽ không bắt bất kỳ trong số này. Ngoài ra còn có các kịch bản khi một giá trị ô có thể chứa một dòng mới, vì vậy trong các trường hợp này, mảng nội dung của bạn cũng sẽ không chính xác. Đây là lý do tại sao những người khác đang đề xuất sử dụng thư viện, chẳng hạn như CHCSV Parser. Chúng được xây dựng để xử lý tất cả các tình huống này. – Rob

17

Dưới đây là một thể loại đơn giản trên NSString để phân tích một chuỗi CSV mà có dấu phẩy nhúng bên trong khối báo giá.

#import "NSString+CSV.h" 

@implementation NSString (CSV) 

- (NSArray *)componentsSeparatedByComma 
{ 
    BOOL insideQuote = NO; 
    NSMutableArray *results = [[NSMutableArray alloc] init]; 
    NSMutableArray *tmp = [[NSMutableArray alloc] init]; 

    for (NSString *s in [self componentsSeparatedByString:@","]) { 
     if ([s rangeOfString:@"\""].location == NSNotFound) { 
      if (insideQuote) { 
       [tmp addObject:s]; 
      } else { 
       [results addObject:s]; 
      } 
     } else { 
      if (insideQuote) { 
       insideQuote = NO; 
       [tmp addObject:s]; 
       [results addObject:[tmp componentsJoinedByString:@","]]; 
       tmp = nil; 
       tmp = [[NSMutableArray alloc] init]; 
      } else { 
       insideQuote = YES; 
       [tmp addObject:s]; 
      } 
     } 
    } 

    return results; 
} 

@end 

này giả định bạn đã đọc tệp CSV của bạn vào một mảng đã:

myArray = [myData componentsSeparatedByString:@"\n"]; 

Mã này không tính đến dấu ngoặc kép trốn thoát, nhưng nó có thể dễ dàng được mở rộng để.

Các vấn đề liên quan