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) を使用
データをコピーする
$ 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に変換する
データをコピーする
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の任意の範囲を":"区切りに変換する
データをコピーする
入力データのデリミタに"\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