Czytam z pliku csv i chcę podzielić długi ciąg, który otrzymuję za pomocą stringWithContentsOfFile, który jest ciągiem o wielu wierszach, z pojedynczymi wierszami reprezentującymi wiersze w pliku csv. Jak mam to zrobic?jak podzielić ciąg znaków z znakami nowej linii
Odpowiedz
Możesz przerwać ciąg na tablice ciągów, a następnie manipulować nimi, jak chcesz.
NSArray *brokenByLines=[yourString componentsSeparatedByString:@"\n"]
To daje wiele założeń co do tego, jakie są separatory linii. – uchuugaka
Jeśli nie wiesz, co to są separatory linii: 'let lines = stringData.stringByReplacingOccurrencesOfString (" \ r \ n ", withString:" \ "n"). StringByReplacingOccurrencesOfString ("\ r", withString: "\ n") .componentsSeparatedByString ("\ n") ' – Zaphod
Nie trzeba zastępować @" \ r ", jeśli ciąg jest oddzielony newLineCharacterSet; –
Musisz oddzielić zawartość za pomocą "\ n".
NSString *str= [NSString stringWithContentsOfFile:filePathLib encoding:NSUTF8StringEncoding error:nil];
NSArray *rows = [str componentsSeparatedByString:@"\n"];
for(int i =0;i<[rows count];i++)
NSLog(@"Row %d: %@",i,[rows objectAtIndex:i]);
To również tworzy założenia dotyczące separatorów linii – uchuugaka
Na wypadek, gdyby ktoś natknął się na to pytanie tak jak ja. To będzie pracować z dowolnymi znakami nowej linii:
NSCharacterSet *separator = [NSCharacterSet newlineCharacterSet];
NSArray *rows = [yourString componentsSeparatedByCharactersInSet:separator];
Trzeba mieć świadomość, że \n
nie jedyny znak używany do dzielenia nową linię. Na przykład, jeśli plik został zapisany w systemie Windows, znaki nowej linii będą następujące: \r\n
. Przeczytaj the Newline article in Wikipedia, aby uzyskać więcej informacji na ten temat.
Tak więc, jeśli po prostu użyjesz componentsSeparatedByString("\n")
, możesz uzyskać nieoczekiwane wyniki.
let multiLineString = "Line 1\r\nLine 2\r\nLine 3\r\n"
let lineArray = multiLineStringRN.componentsSeparatedByString("\n")
// ["Line 1\r", "Line 2\r", "Line 3\r", ""]
Należy zwrócić uwagę na resztę \r
i pusty element tablicy.
Istnieje kilka sposobów na uniknięcie tych problemów.
Solutions
1. componentsSeparatedByCharactersInSet
let multiLineString = "Line 1\nLine 2\r\nLine 3\n"
let newlineChars = NSCharacterSet.newlineCharacterSet()
let lineArray = multiLineString.componentsSeparatedByCharactersInSet(newlineChars).filter{!$0.isEmpty}
// "[Line 1, Line 2, Line 3]"
Jeśli filter
nie były używane, a następnie \r\n
przyniosłoby pusty element tablicy, ponieważ jest ona liczona jako dwa znaki i tak oddziela ciąg dwukrotnie u ta sama lokalizacja.
2. split
let multiLineString = "Line 1\nLine 2\r\nLine 3\n"
let newlineChars = NSCharacterSet.newlineCharacterSet()
let lineArray = multiLineString.utf16.split { newlineChars.characterIsMember($0) }.flatMap(String.init)
// "[Line 1, Line 2, Line 3]"
lub
let multiLineString = "Line 1\nLine 2\r\nLine 3\n"
let lineArray = multiLineString.characters.split { $0 == "\n" || $0 == "\r\n" }.map(String.init)
// "[Line 1, Line 2, Line 3]"
Tutaj \r\n
dostaje liczone jako jeden znak Swift (rozszerzony grafem cluster)
3. enumerateLines
let multiLineString = "Line 1\nLine 2\r\nLine 3\n"
var lineArray = [String]()
multiLineString.enumerateLines { (line, stop) ->() in
lineArray.append(line)
}
// "[Line 1, Line 2, Line 3]"
Aby uzyskać więcej informacji o składni enumerateLine
, zobacz także: this answer.
Uwagi:
- multi linia ciąg nie będzie zwykle mieszać zarówno
\r\n
i\n
ale robię to, żeby pokazać, że metody te mogą obsługiwać oba formaty. NSCharacterSet.newlineCharacterSet()
są znakami nowej linii zdefiniowanymi jako (U + 000A-U + 000D, U + 0085), które obejmują\r
i\n
. Ta odpowiedź jest podsumowaniem odpowiedzi na my previous question. Przeczytaj te odpowiedzi, aby uzyskać więcej szczegółów.
Swift 3 wersja:
let lines = yourString.components(separatedBy: .newlines)
Nicea i krótkie.
Oto moje zdanie na jej temat:
NSString* string = @"FOO\r\nBAR\r\r\n\rATZ\rELM327 v1.5";
NSCharacterSet* newlineSet = [NSCharacterSet newlineCharacterSet];
NSCharacterSet* whitespaceSet = [NSCharacterSet whitespaceAndNewlineCharacterSet];
NSArray<NSString*>* components = [string componentsSeparatedByCharactersInSet:newlineSet];
NSPredicate* predicate = [NSPredicate predicateWithBlock:^BOOL(NSString* _Nullable string, NSDictionary<NSString *,id> * _Nullable bindings){
return [string stringByTrimmingCharactersInSet:whitespaceSet].length > 0;
}];
NSArray<NSString*>* lines = [components filteredArrayUsingPredicate:predicate];
[lines enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"Line %u = '%@'", idx, obj);
}];
Uruchomienie tego drukuje:
2017-10-24 15:26:05.380 Untitled 5[64977:3182818] Line 0 = 'FOO'
2017-10-24 15:26:05.380 Untitled 5[64977:3182818] Line 1 = 'BAR'
2017-10-24 15:26:05.380 Untitled 5[64977:3182818] Line 2 = 'ATZ'
2017-10-24 15:26:05.380 Untitled 5[64977:3182818] Line 3 = 'ELM327 v1.5'
To może nie być najbardziej efektywny sposób (prawdopodobnie za pomocą NSScanner
byłoby szybciej), ale to rozwiązuje problem tutaj.
- 1. W PHP, w jaki sposób można podzielić ciąg spacjami, przecinkami i znakami nowej linii jednocześnie
- 2. Jak zastąpić znaki nowej linii znakami tabulatora?
- 3. Zamień ciąg znaków znakiem nowej linii PHPStorm
- 4. Długi ciąg PHP bez nowej linii
- 5. podzielić ciąg co 5 znaków
- 6. Jak podzielić ciąg znaków w Pythonie?
- 7. Jak podzielić ciąg z angularJS
- 8. String podzielić na nowej linii, zakładki i pewnej liczby miejsc
- 9. Java - jak podzielić ciąg znaków plusa?
- 10. podzielonego ciąg przez przestrzeń i nowej linii w JavaScript
- 11. Jak mogę uzyskać ciąg znaków z danych wejściowych bez dodawania nowej linii za pomocą fgets?
- 12. Jak odczytywać cin z białymi znakami aż do znaku nowej linii?
- 13. Python: Zapobieganie wypływowi plików z dodawania znaków nowej linii
- 14. Jak podzielić ciąg znaków na ogranicznik na tablicę?
- 15. Jak wyodrębnić ciąg między dwoma znakami "/"
- 16. Jak podzielić łańcuch z białymi znakami na początku?
- 17. Wyrażenie regularne: jak dopasować ciąg zawierający "\ n" (znak nowej linii)?
- 18. Jak podzielić rozdzielany ciąg znaków na tablicę w awk?
- 19. Jak mogę podzielić ciąg znaków na pierwsze wystąpienie czegoś?
- 20. Jak podzielić ciąg znaków przez ogranicznik od prawej?
- 21. Jak podzielić ciąg znaków na konkretny znak w Rebol
- 22. Zamień spacje z nowej linii w makefile
- 23. Jak wydrukować ciąg znaków za pomocą pl/sql bez dołączania znaku nowej linii na końcu
- 24. Jak podzielić ciąg przez ciąg w PowerShell
- 25. Jak mogę podzielić ciąg z ogranicznikiem łańcucha?
- 26. Jak podzielić ciąg na tablicę wielu słów?
- 27. Jak podzielić ciąg w make?
- 28. jQuery textarea append zachowanie nowej linii
- 29. Jak podzielić ciąg na ukośnik w bash
- 30. jak podzielić ciąg w javascript
Po co ładować cały plik do pamięci? To nie pomoże twojemu śladowi pamięci ... – trojanfoe
Może wiadomo, że plik nie będzie tak duży. It * is * just text ... – uchuugaka
tak ... plik jest wystarczająco mały ... ma tylko 54 wiersze i 4 kolumny! –