デリミタを変換する

excelの列のデータをcsvに変換したかったが、そのときすぐにできなかったので、後日、プログラムを書いてみた。


(stdin2csv.pl) perl

#!/usr/bin/env perl

$usage =<<EOS;
usage : $0 [-indel <str>] [-outdel <str>]
  -indel 入力テキストのデリミタを指定する
  -outdel 出力テキストのデリミタを指定する
EOS

$indel  = "\n";
$outdel = ",";

$i = 0;
while( $i < $#ARGV + 1 ){
  if( $ARGV[$i] =~ /^-indel$/ ){
    $i++;
    if( $ARGV[$i] =~ /.+/ ){
      $indel = $ARGV[$i];
    }else{
      die $usage;
    }
  }elsif( $ARGV[$i] =~ /^-outdel$/ ){
    $i++;
    if( $ARGV[$i] =~ /.+/ ){
      $outdel = $ARGV[$i];
      $outdel =~ s/\\t/\t/g; #タブコード対応
      $outdel =~ s/\\n/\n/g; #改行コード対応
    }else{
      die $usage;
    }
  }else{
    die $usage;
  }
  $i++;
}

while(<STDIN>){
  $str = $str . $_;
}

@temp = split(/$indel/, $str);
print join($outdel, @temp);

I get output with hardcoded \t between array values
My\tName\tIs\tDave
https://stackoverflow.com/questions/34177162/perl-join-on-t-in-single-quotes/34177681



(stdin2csv.rb) ruby

#!/usr/bin/env ruby

usage =<<'EOS'
usage : $0 [-indel <str>] [-outdel <str>]
  -indel 入力テキストのデリミタを指定する
  -outdel 出力テキストのデリミタを指定する
EOS

indel  = "\n"
outdel = ","

i = 0;
while i < ARGV.size do
  if ARGV[i] =~ /^-indel$/
    i = i + 1
    if ARGV[i] =~ /.+/
      indel = ARGV[i].to_s
    else
      abort usage
    end
  elsif ARGV[i] =~ /^-outdel$/
    i = i + 1
    if ARGV[i] =~ /.+/
      outdel = +ARGV[i]
      outdel.gsub!(/\\t/, "\t") #タブコード対応
      outdel.gsub!(/\\n/, "\n") #改行コード対応
    else
      abort usage
    end
  else
    abort usage
  end
  i = i + 1
end

str = ""
STDIN.each do |line|
  str = str + line
end

temp = str.split(/#{indel}/)
puts temp.join(outdel)

文字列の解凍(Ruby 2.3以降)
https://qiita.com/iwamot/items/2ddf8de09d5dbcad2df9

列のデータ(改行区切り)をcsvに変換する


郵便番号データダウンロード
https://www.post.japanpost.jp/zipcode/download.html

読み仮名データの促音・拗音を小書きで表記するもの>全国一括(KEN_ALL.CSV) を使用


データをコピーする
f:id:tigerii:20210613003626p:plain

$ cat | ./stdin2csv.pl
◆ここでペーストする
600000
640941
600041
600042
640820
600031
600001
640821
600032
◆ここでctrl+dを押すと、変換結果が表示される
600000,640941,600041,600042,640820,600031,600001,640821,600032

excelの任意の範囲をcsvに変換する

データをコピーする
f:id:tigerii:20210613004947p:plain


excelのセル間のデータはタブで区切られているので、入力データのデリミタに"\t"を指定する。

$ cat | ./stdin2csv.pl -indel "\t"
◆ここでペーストする
1101    60      600000  ホツカイドウ サツポロシチユウオウク    イカニケイサイガナイバアイ 北海道  札幌市中央区    以下に掲載がない場合
1101    64      640941  ホツカイドウ サツポロシチユウオウク    アサヒガオカ 北海道  札幌市中央区    旭ケ丘
1101    60      600041  ホツカイドウ サツポロシチユウオウク    オオドオリヒガシ      北海道  札幌市中央区    大通東
1101    60      600042  ホツカイドウ サツポロシチユウオウク    オオドオリニシ(1-19チヨウメ)      北海道  札幌市中央区    大通西(1~19丁目)
1101    64      640820  ホツカイドウ サツポロシチユウオウク    オオドオリニシ(20-28チヨウメ)     北海道  札幌市中央区    大通西(20~28丁目)
1101    60      600031  ホツカイドウ サツポロシチユウオウク    キタ1ジヨウヒガシ     北海道  札幌市中央区    北一条東
1101    60      600001  ホツカイドウ サツポロシチユウオウク    キタ1ジヨウニシ(1-19チヨウメ)     北海道  札幌市中央区    北一条西(1~19丁目)
1101    64      640821  ホツカイドウ サツポロシチユウオウク    キタ1ジヨウニシ(20-28チヨウメ)    北海道  札幌市中央区    北一条西(20~28丁目)
1101    60      600032  ホツカイドウ サツポロシチユウオウク    キタ2ジヨウヒガシ     北海道  札幌市中央区    北二条東
◆ここでctrl+dを押すと、変換結果が表示される
1101,60,600000,ホツカイドウ,サツポロシチユウオウク,イカニケイサイガナイバアイ,北海道,札幌市中央区,以下に掲載がない場合
1101,64,640941,ホツカイドウ,サツポロシチユウオウク,アサヒガオカ,北海道,札幌市中央区,旭ケ丘
1101,60,600041,ホツカイドウ,サツポロシチユウオウク,オオドオリヒガシ,北海道,札幌市中央区,大通東
1101,60,600042,ホツカイドウ,サツポロシチユウオウク,オオドオリニシ(1-19チヨウメ),北海道,札幌市中央区,大通西(1~19丁目)
1101,64,640820,ホツカイドウ,サツポロシチユウオウク,オオドオリニシ(20-28チヨウメ),北海道,札幌市中央区,大通西(20~28丁目)
1101,60,600031,ホツカイドウ,サツポロシチユウオウク,キタ1ジヨウヒガシ,北海道,札幌市中央区,北一条東
1101,60,600001,ホツカイドウ,サツポロシチユウオウク,キタ1ジヨウニシ(1-19チヨウメ),北海道,札幌市中央区,北一条西(1~19丁目)
1101,64,640821,ホツカイドウ,サツポロシチユウオウク,キタ1ジヨウニシ(20-28チヨウメ),北海道,札幌市中央区,北一条西(20~28丁目)
1101,60,600032,ホツカイドウ,サツポロシチユウオウク,キタ2ジヨウヒガシ,北海道,札幌市中央区,北二条東

excelの任意の範囲を":"区切りに変換する

データをコピーする
f:id:tigerii:20210613004947p:plain


入力データのデリミタに"\t"を指定し、出力データのデリミタには":"を指定する。

$ cat | ./stdin2csv.pl -indel "\t" -outdel :
◆ここでペーストする
1101    60      600000  ホツカイドウ サツポロシチユウオウク    イカニケイサイガナイバアイ 北海道  札幌市中央区    以下に掲載がない場合
1101    64      640941  ホツカイドウ サツポロシチユウオウク    アサヒガオカ 北海道  札幌市中央区    旭ケ丘
1101    60      600041  ホツカイドウ サツポロシチユウオウク    オオドオリヒガシ      北海道  札幌市中央区    大通東
1101    60      600042  ホツカイドウ サツポロシチユウオウク    オオドオリニシ(1-19チヨウメ)      北海道  札幌市中央区    大通西(1~19丁目)
1101    64      640820  ホツカイドウ サツポロシチユウオウク    オオドオリニシ(20-28チヨウメ)     北海道  札幌市中央区    大通西(20~28丁目)
1101    60      600031  ホツカイドウ サツポロシチユウオウク    キタ1ジヨウヒガシ     北海道  札幌市中央区    北一条東
1101    60      600001  ホツカイドウ サツポロシチユウオウク    キタ1ジヨウニシ(1-19チヨウメ)     北海道  札幌市中央区    北一条西(1~19丁目)
1101    64      640821  ホツカイドウ サツポロシチユウオウク    キタ1ジヨウニシ(20-28チヨウメ)    北海道  札幌市中央区    北一条西(20~28丁目)
1101    60      600032  ホツカイドウ サツポロシチユウオウク    キタ2ジヨウヒガシ     北海道  札幌市中央区    北二条東
◆ここでctrl+dを押すと、変換結果が表示される
1101:60:600000:ホツカイドウ:サツポロシチユウオウク:イカニケイサイガナイバアイ:北海道:札幌市中央区:以下に掲載がない場合
1101:64:640941:ホツカイドウ:サツポロシチユウオウク:アサヒガオカ:北海道:札幌市中央区:旭ケ丘
1101:60:600041:ホツカイドウ:サツポロシチユウオウク:オオドオリヒガシ:北海道:札幌市中央区:大通東
1101:60:600042:ホツカイドウ:サツポロシチユウオウク:オオドオリニシ(1-19チヨウメ):北海道:札幌市中央区:大通西(1~19丁目)
1101:64:640820:ホツカイドウ:サツポロシチユウオウク:オオドオリニシ(20-28チヨウメ):北海道:札幌市中央区:大通西(20~28丁目)
1101:60:600031:ホツカイドウ:サツポロシチユウオウク:キタ1ジヨウヒガシ:北海道:札幌市中央区:北一条東
1101:60:600001:ホツカイドウ:サツポロシチユウオウク:キタ1ジヨウニシ(1-19チヨウメ):北海道:札幌市中央区:北一条西(1~19丁目)
1101:64:640821:ホツカイドウ:サツポロシチユウオウク:キタ1ジヨウニシ(20-28チヨウメ):北海道:札幌市中央区:北一条西(20~28丁目)
1101:60:600032:ホツカイドウ:サツポロシチユウオウク:キタ2ジヨウヒガシ:北海道:札幌市中央区:北二条東

/dev/clipboardを使用する場合

cygwinだと/dev/clipboardにクリップボードの内容が保存されているので以下のように実行できる。(キャリッジリターンは削除している)

$ cat /dev/clipboard | tr -d "/r" | ./stdin2csv.pl -indel "\t" -outdel :
1101:60:600000:ホツカイドウ:サツポロシチユウオウク:イカニケイサイガナイバアイ:北海道:札幌市中央区:以下に掲載がない場合
1101:64:640941:ホツカイドウ:サツポロシチユウオウク:アサヒガオカ:北海道:札幌市中央区:旭ケ丘
1101:60:600041:ホツカイドウ:サツポロシチユウオウク:オオドオリヒガシ:北海道:札幌市中央区:大通東
1101:60:600042:ホツカイドウ:サツポロシチユウオウク:オオドオリニシ(1-19チヨウメ):北海道:札幌市中央区:大通西(1~19丁目)
1101:64:640820:ホツカイドウ:サツポロシチユウオウク:オオドオリニシ(20-28チヨウメ):北海道:札幌市中央区:大通西(20~28丁目)
1101:60:600031:ホツカイドウ:サツポロシチユウオウク:キタ1ジヨウヒガシ:北海道:札幌市中央区:北一条東
1101:60:600001:ホツカイドウ:サツポロシチユウオウク:キタ1ジヨウニシ(1-19チヨウメ):北海道:札幌市中央区:北一条西(1~19丁目)
1101:64:640821:ホツカイドウ:サツポロシチユウオウク:キタ1ジヨウニシ(20-28チヨウメ):北海道:札幌市中央区:北一条西(20~28丁目)
1101:60:600032:ホツカイドウ:サツポロシチユウオウク:キタ2ジヨウヒガシ:北海道:札幌市中央区:北二条東


↓後日こういうことができることを知る。やりたかったことはこれ!!

group byで同じデータを集約した時に,NULL以外の値を含む文字列を連結して返す
https://tigerii.hatenablog.com/entry/2021/06/15/200828