27

csvファイルから読み取り、複数行の文字列であるstringWithContentsOfFileを使用して取得した長い文字列を、csvファイルの行を表す個々の行で分割したいと思います。どうすればよいですか?

4

6 に答える 6

43

私のように誰かがこの質問に出くわした場合に備えて。これは、改行文字で機能します。

NSCharacterSet *separator = [NSCharacterSet newlineCharacterSet];
NSArray *rows = [yourString componentsSeparatedByCharactersInSet:separator];
于 2015-04-09T09:38:37.073 に答える
31

文字列を文字列の配列に分割して、必要に応じて操作できます。

NSArray *brokenByLines=[yourString componentsSeparatedByString:@"\n"]
于 2013-03-01T11:25:08.813 に答える
21

\n新しい行を分割するために使用される文字は だけではないことに注意してください。たとえば、ファイルが Windows で保存された場合、改行文字は\r\n. 詳細については、Wikipedia の 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", ""]

残差\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]"

filter使用されていない場合\r\n、空の配列要素が生成されます。これは、2 文字としてカウントされ、同じ場所で文字列が 2 回区切られるためです。

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]"

また

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]"

ここで\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]"

enumerateLine構文の詳細については、この回答も参照してください。

ノート:

  • \r\n通常、複数行の文字列は両方を混在させることはありません\nが、ここでは、これらのメソッドが両方の形式を処理できることを示すためにこれを行っています。
  • NSCharacterSet.newlineCharacterSet()(U+000A–U+000D, U+0085) として定義される改行文字で、 と が含ま\r\nます。
  • この回答は、以前の質問に対する回答の要約です。詳細については、それらの回答をお読みください。
于 2015-08-18T03:16:54.277 に答える
13

スウィフト 3バージョン:

let lines = yourString.components(separatedBy: .newlines)

素敵で短い。

于 2017-02-21T06:19:22.857 に答える
2

コンテンツは「\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]);
于 2013-03-01T11:42:58.107 に答える