由来の分からない有象無象のテキスト数千件から改行を取り除くというタスクがありまして。目的は、まあよくあるtsvファイル化です。tsvなのでとりあえずデータ区切りとかち合う改行とタブを除けば良いわけです。
ひとまず元データを1件ずつ読み込むことはできたんですが、なにせいろんな人がいろんな環境で自由入力したテキストなんで改行やらタブやらが含まれるんですね。
で、最初改行(とタブと空白)の除去をこうやろうとしたんです。
let nonewline = String(text.characters.filter { !" \n\t\r".characters.contains($0) })
でも、これだとどうも除去できない改行があるんですね。¥nでも¥rでもマッチしない改行って何!?
ひとまずよくわからないので、OSの認識に任せてみようと思って、こうしてみました。
let nonewline = text.components(separatedBy: .whitespacesAndNewlines).joined(separator: " ")
componentsに分解してjoinするっていうのは回りくどいようですが、CharacterSetを使う場合はこれが楽だったのでこうしました。
それはさておき、これはうまくいきました。ということは、¥nと¥r以外の改行があるってことなんでしょうか・・・と思って、定義を見てみたらこういうコメントが入ってました。
/// Returns a character set containing the newline characters (`U+000A ~ U+000D`, `U+0085`, `U+2028`, and `U+2029`).
public static var newlines: CharacterSet { get }
なにこれけっこういっぱいある!! U+000A〜U+000Dで4個、そのほかにさらに3個で計7個!
謎だったのでググってみたらこういうことのようです。
入力改行コード指定
ということで、改行コードは意外に種類があるので、扱うときはなるべく CharacterSet.newlines を使いましょうというお話でした。