2011-01-08 2 views
3

Эй, ребята. Я использую CHCSVParser от Dave DeLong для анализа CSV. Я могу разобрать csv локально, но я не могу загрузить его удаленный файл csv. Я слишком долго смотрел на свой MacBook, и ответ прямо передо мной. Вот мой код:Загрузить удаленный csv в CHCSVParser

NSString *urlStr = [[NSString alloc] initWithFormat:@"http://www.somewhere.com/LunchSpecials.csv"]; 
NSURL *lunchFileURL = [NSURL URLWithString:urlStr]; 
NSStringEncoding encoding = 0; 
CHCSVParser *p = [[CHCSVParser alloc] initWithContentsOfCSVFile:[lunchFileURL path] usedEncoding:&encoding error:nil]; 
[p setParserDelegate:self]; 
[p parse]; 
[p release]; 

Спасибо за любую помощь, которую кто-то может мне дать.

+1

Я могу быть уверен, что сам человек ответит на ваш вопрос. Просто подожди. –

+0

@ Джакоб звучит как разумно безопасная ставка. ;) –

ответ

6

-[NSURL path] не делать то, что вы ожидали.

Если у меня есть URL http://stackoverflow.com/questions/4636428, то это -path is /questions/4636428. Когда вы передадите этот путь в CHCSVParser, он попытается открыть этот путь в локальной системе. Поскольку этот файл не существует, вы не сможете его открыть.

Что вам нужно сделать (как указывает Уолтер), загрузить файл CSV локально, а затем открыть его. Вы можете загрузить файл несколькими способами (+[NSString stringWithContentsOfURL:...], NSURLConnection и т. Д.). После того, как вы сохранили файл, сохраненный локально на диске, или строку CSV в памяти, вы можете передать ее парсеру.

Если это очень большой файл, вы должны указать alloc/init a CHCSVParser с указанием пути к локальной копии файла CSV. Затем синтаксический анализатор будет читать его пополам и сообщать вам, что он находит, через обратные вызовы делегатов.

Если файл CSV не очень большой, то вы можете сделать:

NSString * csv = ...; //the NSString containing the contents of the CSV file 
NSArray * rows = [csv CSVComponents]; 

Это возвращает NSArray из NSArrays в NSStrings.

Подобно этому последнему подход использует метод NSArray категории:

NSString * csv = ...; 
NSError * error = nil; 
NSArray * rows = [NSArray arrayWithContentsOfCSVString:csv encoding:[csv fastestEncoding] error:&error]; 

Это будет возвращать ту же структуру (NSArray из NSArrays из NSStrings), но он также предоставит вам NSError объект, если он встречает синтаксическую ошибку в файле CSV (т. е. неверный CSV).

+0

Спасибо Dave за вашу помощь! У меня было много вопросов. Кстати, отличный парсер! Это пригодится для моего приложения. – Matt

+0

@Dave 'CHCSVParser' содержит категорию на' NSString'? Круто! –

+0

@ Jacob Relkin yep и 'NSArray'. –

1

Я думаю, что вам нужна NSString, а не объект NSURL для передачи в парсер, поэтому проблема, которую вы делаете с изменением NSString в NSURL, является проблемой. Глядя на документацию CHCSVParser, похоже, что он хочет NSString в init.

Так что, может быть, вы могли бы сделать что-то вроде:

NSError *err = [[[NSError alloc] init] autorelease]; 
NSString *lunchFileURL = [[NSString stringWithFormat:@"http://www.somewhere.com/LunchSpecials.csv"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSString *lunchFile = [NSString stringWithContentsOfURL:[NSURL URLWithString:lunchFileURL] encoding:NSUTF8StringEncoding error:&err]; 
CHCSVParser *p = [[CHCSVParser alloc] initWithContentsOfCSVString:lunchFile usedEncoding:&encoding error:nil]; 
+0

Исправить в принципе, неправильно в реализации. Правильно, что 'CHCSVParser' не использует' NSURL'. Неправильно в том, что 'NSString' не имеет метода' -path', а также переменная '' lunchFile' содержит содержимое CSV-файла и не представляет собой физический файл на диске. –

+0

Thans Dave для этого. Я обновил этот пример, чтобы он был правильным на основе ваших предложений по исправлению. Я пошел вперед и просто сохранил строку, а не сохранил переменную «lunchFile» на диске, а затем прочитал ее обратно. – Walter

Смежные вопросы