2011-12-25 16 views
7

Czytam pliku CSV do tablicy przy użyciu:Dlaczego każdy inny obiekt w mojej tablicy jest pusty?

NSString *theWholeTable = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"example" ofType:@"csv"] 
                encoding:NSUTF8StringEncoding 
                 error:NULL]; 
NSArray *tableRows = [theWholeTable componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]]; 

i każdego drugiego obiektu w tablicy jest pusta, każdy pomysł dlaczego?

dane pliku CSV wygląda tak: 10,156,326,614,1261,1890,3639,5800,10253,20914 20,107,224,422,867,1299,2501,3986,7047,14374

z 10 i 20 jest początek każda nowa linia.

z góry dzięki.

Edit Próbowałem za pomocą następującego kodu:

NSArray *tableRows = [theWholeTable componentsSeparatedByString:@"\n"]; 

I to działało tak jak chciałem go zbyt.

Chociaż jestem jeszcze pewien, dlaczego newlineCharacterSet stworzony pustych obiektów ...

+3

Czy plik 'CSV' pochodzi z komputera z systemem Windows? – dasblinkenlight

Odpowiedz

9

Jeśli plik CSV pochodzi z systemu UNIX nie może zawierać wiele separatorów (np \r\n zamiast \n). W takim przypadku componentsSeparatedByCharactersInSet wstawi puste ciągi znaków dla pustych sekwencji znaków między \r i \n.

Można usunąć puste struny od NSArray użyciu tej metody:

tableRows = [tableRows filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length > 0"]]; 
+0

Ach OK, dzięki za wyjaśnienie, to ma sens. Ten konkretny plik CSV, a następnie TXT został utworzony z prostej tabeli przy użyciu numerów Apple. Próbowałem znaleźć coś, co pokaże mi znaczniki formatowania w pliku bezskutecznie. I dzięki za wskazówki predykatu, które przydadzą się. –

+0

Awesome 1-liner, aby wywołanie metody Apple zachowywało się tak, jak tego potrzebujesz do 90% czasu, dziękuję. – Adam

+0

Myślałem, że cały powód użycia newLineCharacterSet polegał na tym, że wszystkie zakończenia linii zostały potraktowane (windows, apple legacy, linux i intel mac)? Jeśli wiesz, że twoje dane są dostępne tylko dla jednego systemu operacyjnego, możesz po prostu użyć characterSetWithCharactersInString: @ "\ n" – Miek

1

aby rozwiązać ten problem, użyłem inny sposób:

NSArray *tableRows = [theWholeTable componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"\n"]] 

Więc nie będzie musiał usunąć wszystkie wiersze.

Powiązane problemy