テキスト(特にパターン化された書式のテキストファイルを)処理する上で、文字列を指定文字で分割してリストにするsplit
と、リストを指定文字で結合して文字列にするjoin
は、使いこなせるかどうかで作業時間に大きく差がでてくると個人的に思ってるけど、各言語微妙に癖があるので基本的な使い方をまとめてみた。
言語 | バージョン | OS |
---|---|---|
Perl | 5.26.1 | Ubuntu 18.04 |
PowerShell | 5.1.17763.316 | Windows 10 home |
Java | 1.8.0_131 | Windows 10 home |
Kotlin | 1.3.21 | Android 7.0 |
Python2 | 2.7.15 | Ubuntu 18.04 |
Python3 | 3.6.7 | Ubuntu 18.04 |
バージョンはコンパイラ/インタプリタのもの。OSは実行環境。
- 編集履歴
- 2019.05.14: KotlinのコードをAndroid非依存のものに変更
split
例はスペース込みカンマ区切りの文字列を分割する。
正規表現はどの言語も基本使えるが、Kotlin・Pythonでは別途ライブラリの利用が必要。
Perl
# !/usr/bin/perl
my $string = "元町・中華街, 日本大通り, 馬車道, みなとみらい, 横浜";
my @item = split /,\s*/, $string;
for my $i (@item) {
print $i, "\n";
}
実行結果
$ ./split.pl
元町・中華街
日本大通り
馬車道
みなとみらい
横浜
PowerShell
$string = "元町・中華街, 日本大通り, 馬車道, みなとみらい, 横浜"
$item = $string -split ",\s*"
foreach ($i in $item) {
Write-Output $i
}
実行結果
PS C:\Users\zaki\src\share> .\split.ps1
元町・中華街
日本大通り
馬車道
みなとみらい
横浜
PS C:\Users\zaki\src\share>
ソースのエンコードはShift-JIS
Java
private static void sprit_example() {
String string = "元町・中華街, 日本大通り, 馬車道, みなとみらい, 横浜";
String[] item = string.split(",\\s*");
for (String i : item) {
System.out.println(i);
}
}
実行結果
元町・中華街
日本大通り
馬車道
みなとみらい
横浜
Kotlin
fun split_join() {
val string: String = "元町・中華街, 日本大通り, 馬車道, みなとみらい, 横浜"
val item = string.split(",")
for (i in item) {
println(i)
}
}
実行結果
元町・中華街
日本大通り
馬車道
みなとみらい
横浜
Javaと異なり、正規表現はそのまま使えず、Regex
インスタンスを作る必要がある。
fun split_regexp() {
val string: String = "元町・中華街, 日本大通り, 馬車道, みなとみらい, 横浜"
val item = string.split(Regex(",\\s*"))
for (i in item) {
println(i)
}
}
元町・中華街
日本大通り
馬車道
みなとみらい
横浜
Python2
# !/usr/bin/python2
# -*- coding: utf-8 -*-
string = "元町・中華街, 日本大通り, 馬車道, みなとみらい, 横浜"
item = string.split(", ")
for i in item:
print i
出力は以下の通り
元町・中華街
日本大通り
馬車道
みなとみらい
横浜
正規表現を使用するには、re
のインポートが必要。
import re
item = re.split(r',\s*', string)
for i in item:
print i
Python3
Python2と同様。
# !/usr/bin/python3
string = "元町・中華街, 日本大通り, 馬車道, みなとみらい, 横浜"
item = string.split(", ")
for i in item:
print(i)
import re
item = re.split(r',\s*', string)
for i in item:
print(i)
join
各言語、前述のsplit
でリストになったものと同等のitem
配列を宣言し、「","
で結合して、前後に"
を追加」して、「クォートされた文字列のカンマ区切り」にするコード。
(前後への"
追加は単純な文字列連結で処理)
Perl
my @item = ("元町・中華街", "日本大通り", "馬車道", "みなとみらい", "横浜");
my $join = '"' . (join '","', @item) . '"';
print $join, "\n";
実行結果
"元町・中華街","日本大通り","馬車道","みなとみらい","横浜"
PowerShell
$item = @("元町・中華街", "日本大通り", "馬車道", "みなとみらい", "横浜")
$join = '"' + ($item -join '","') + '"'
Write-Output $join
実行結果
"元町・中華街","日本大通り","馬車道","みなとみらい","横浜"
Java
String item[] = {"元町・中華街", "日本大通り", "馬車道", "みなとみらい", "横浜"};
String join = "\"" + String.join("\",\"", item) + "\"";
System.out.println(join);
実行結果
"元町・中華街","日本大通り","馬車道","みなとみらい","横浜"
Kotlin
val item = arrayOf("元町・中華街", "日本大通り", "馬車道", "みなとみらい", "横浜")
val join = '"' + item.joinToString(separator = "\",\"") + '"'
println(join)
実行結果
"元町・中華街","日本大通り","馬車道","みなとみらい","横浜"
Python2
item = ["元町・中華街", "日本大通り", "馬車道", "みなとみらい", "横浜"]
join = '"' + '","'.join(item) + '"'
print join
"元町・中華街","日本大通り","馬車道","みなとみらい","横浜"
Python3
こちらもPython2と同じ
item = ["元町・中華街", "日本大通り", "馬車道", "みなとみらい", "横浜"]
join = '"' + '","'.join(item) + '"'
print(join)
実行結果
"元町・中華街","日本大通り","馬車道","みなとみらい","横浜"