splitとjoinで文字列のリスト分割と結合(Perl/PowerShell/Java/Kotlin/Python)

テキスト(特にパターン化された書式のテキストファイルを)処理する上で、文字列を指定文字で分割してリストにする`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

```perl
#!/usr/bin/perl

my $string = "元町・中華街, 日本大通り, 馬車道, みなとみらい, 横浜";
my @item = split /,\s*/, $string;

for my $i (@item) {
    print $i, "\n";
}
```

実行結果

```text
$ ./split.pl
元町・中華街
日本大通り
馬車道
みなとみらい
横浜
```

## PowerShell

```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

```java
    private static void sprit_example() {
        String string = "元町・中華街, 日本大通り, 馬車道, みなとみらい, 横浜";
        String[] item = string.split(",\\s*");
        for (String i : item) {
            System.out.println(i);
        }
    }
```

実行結果

```
元町・中華街
日本大通り
馬車道
みなとみらい
横浜
```

## Kotlin

```kotlin
fun split_join() {
    val string: String = "元町・中華街, 日本大通り, 馬車道, みなとみらい, 横浜"
    val item = string.split(",")
    for (i in item) {
        println(i)
    }
}
```

実行結果

```
元町・中華街
 日本大通り
 馬車道
 みなとみらい
 横浜
```

Javaと異なり、正規表現はそのまま使えず、`Regex`インスタンスを作る必要がある。

```kotlin
fun split_regexp() {
    val string: String = "元町・中華街, 日本大通り, 馬車道, みなとみらい, 横浜"
    val item = string.split(Regex(",\\s*"))
    for (i in item) {
        println(i)
    }
}
```

```
元町・中華街
日本大通り
馬車道
みなとみらい
横浜
```

## Python2

```python
#!/usr/bin/python2
# -*- coding: utf-8 -*-

string = "元町・中華街, 日本大通り, 馬車道, みなとみらい, 横浜"
item = string.split(", ")

for i in item:
    print i
```

出力は以下の通り

```text
元町・中華街
日本大通り
馬車道
みなとみらい
横浜
```

正規表現を使用するには、`re`のインポートが必要。

```python
import re
item = re.split(r',\s*', string)
for i in item:
    print i
```

## Python3

Python2と同様。

```python
#!/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

```perl
my @item = ("元町・中華街", "日本大通り", "馬車道", "みなとみらい", "横浜");
my $join = '"' . (join '","', @item) . '"';
print $join, "\n";
```

実行結果

```
"元町・中華街","日本大通り","馬車道","みなとみらい","横浜"
```

## PowerShell

```
$item = @("元町・中華街", "日本大通り", "馬車道", "みなとみらい", "横浜")
$join = '"' + ($item -join '","') + '"'
Write-Output $join
```

実行結果

```
"元町・中華街","日本大通り","馬車道","みなとみらい","横浜"
```

## Java

```java
String item[] = {"元町・中華街", "日本大通り", "馬車道", "みなとみらい", "横浜"};
String join = "\"" + String.join("\",\"", item) + "\"";
System.out.println(join);
```

実行結果

```
"元町・中華街","日本大通り","馬車道","みなとみらい","横浜"
```

## Kotlin

```kotlin
val item = arrayOf("元町・中華街", "日本大通り", "馬車道", "みなとみらい", "横浜")
val join = '"' + item.joinToString(separator = "\",\"") + '"'
println(join)
```

実行結果

```
"元町・中華街","日本大通り","馬車道","みなとみらい","横浜"
```

## Python2

```python
item = ["元町・中華街", "日本大通り", "馬車道", "みなとみらい", "横浜"]
join = '"' + '","'.join(item) + '"'
print join
```

```
"元町・中華街","日本大通り","馬車道","みなとみらい","横浜"
```

## Python3

こちらもPython2と同じ

```python
item = ["元町・中華街", "日本大通り", "馬車道", "みなとみらい", "横浜"]
join = '"' + '","'.join(item) + '"'
print(join)
```

実行結果

```
"元町・中華街","日本大通り","馬車道","みなとみらい","横浜"
```