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)
小智 29
您可以将字符串分解为字符串数组,然后根据需要进行操作.
NSArray *brokenByLines=[yourString componentsSeparatedByString:@"\n"]
Run Code Online (Sandbox Code Playgroud)
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.Swift 3版本:
let lines = yourString.components(separatedBy: .newlines)
Run Code Online (Sandbox Code Playgroud)
好又短.