如何使用换行符拆分字符串

Son*_*Jha 26 newline nsstring ios

我从一个csv文件中读取,并希望使用stringWithContentsOfFile分割我得到的长字符串,这是一个多行字符串,各个行代表csv文件中的行.我该怎么做呢?

Dia*_*rin 41

万一有人像我一样偶然发现这个问题.这适用于任何换行符:

NSCharacterSet *separator = [NSCharacterSet newlineCharacterSet];
NSArray *rows = [yourString componentsSeparatedByCharactersInSet:separator];
Run Code Online (Sandbox Code Playgroud)

  • 如果行分隔符是Windows格式文件中的"\ r \n"(两个字符),则可以在数组中生成空字符串. (6认同)

小智 29

您可以将字符串分解为字符串数组,然后根据需要进行操作.

NSArray *brokenByLines=[yourString componentsSeparatedByString:@"\n"]
Run Code Online (Sandbox Code Playgroud)

  • 这对线分隔符的含量做了很多假设. (5认同)
  • 如果您不知道行分隔符是什么:`let lines = stringData.stringByReplacingOccurrencesOfString(“ \ r \ n”,withString:“ \” n“)。stringByReplacingOccurrencesOfString(” \ r“,withString:” \ n“) .componentsSeparatedByString(“ \ n”)` (2认同)

Sur*_*gch 17

您应该知道,这\n不是用于拆分新行的唯一字符.例如,如果文件保存在Windows中,则换行符将是\r\n.阅读维基百科中的Newline文章,了解有关此内容的更多信息.

因此,如果您只是使用componentsSeparatedByString("\n"),您可能会得到意想不到的结果.

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", ""]
Run Code Online (Sandbox Code Playgroud)

注意残差\r和空数组元素.

有几种方法可以避免这些问题.

解决方案

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]"
Run Code Online (Sandbox Code Playgroud)

如果filter没有使用,\r\n则会生成一个空数组元素,因为它被计为两个字符,因此在同一位置将字符串分隔两次.

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]"
Run Code Online (Sandbox Code Playgroud)

要么

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]"
Run Code Online (Sandbox Code Playgroud)

这里\r\n被视为单个Swift字符(扩展字形集群)

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]"
Run Code Online (Sandbox Code Playgroud)

有关enumerateLine语法的更多信息,请参阅此答案.

笔记:

  • 一个多行字符串通常不会混合两者\r\n,\n但我这样做是为了表明这些方法可以处理这两种格式.
  • NSCharacterSet.newlineCharacterSet()是换行符,定义为(U + 000A-U + 000D,U + 0085),包括\r\n.
  • 这个答案总结了我上一个问题的答案.阅读这些答案以获取更多细节.


Cli*_*rum 9

Swift 3版本:

let lines = yourString.components(separatedBy: .newlines)
Run Code Online (Sandbox Code Playgroud)

好又短.