ファイル操作。。。ぐだぐだ
下記のようなCSVファイル
(1行目:)"タイトル"
(2行目:)"日付","項目1","項目2","項目3"
(3行目:)"2020-04-23","北海道","ほげ","3,500"
(4行目:)"2020-04-24","東京都","あげ","2,323"
........
を,3行目(実際のファイルには()内の~行目とかはついてないよ)以降を抽出し,各行の先頭にユニークID(ファイル名(.csvは除く)- レコードNo(1,2,…))を付与し,hoge_new.csvファイルを生成するスクリプトを考えた。やっかいなのは,ダブルクォートと桁区切りのカンマだ。
$ awk 'BEGIN{FS=","; OFS=":"}NR>=3{print} hoge.csv | sed 's/"/@/g' | sed 's/,//g' | sed 's/@/:/g' | awk '{print $2, $4, $6, $8}' > hoge.txt
$ cat -n hoge.txt | sed 's/\t/:/g' | sed 's/ //g' > hoge.dat
$ grep -H "" hoge.dat | sed 's/\.dat//g' | awk 'BEGIN{FS=":"; OFS=","}{print $1 "-" $2, $3, $4, $5, $6} > hoge_new.csv
$ rm *.txt *.dat
てな具合。もっとスマートにできないかなぁ・・・。
ファイル名を各行の先頭に入れる
標記をどうするか。
例えば,下記のようなファイルがあったとして
$ cat hoge.txt
aaaa bbbb cccc
dddd eeee ffff
この2行を
hoge.txt aaaa bbbb cccc
hoge.txt dddd eeee ffff
にしたい。
できれば同一フォルダのファイル全てにやりたい。
まずは,ファイルひとつからやってみる。
やってみる。join:オペランドがありません。
ls hoge.txt | paste - hoge.txt
1行のみ結合。
hoge.txt:aaaa bbbb cccc
hoge.txt:dddd eeee ffff
どや。
これでもとのhoge.txtのフィールド区切りを「:」にしてやればOKじゃねぇ?!!
いやぁ,解決!解決!!!。半日考えてた。。。
ではまた。
って。解決していないよ。同一フォルダ全部やるんだよ!!
うーん。そこはスクリプト作るなりなんなりで・・・まずはやってみます。
ファイル整理
こんにちは。
今日も在宅勤務しています。日曜日ですが・・・
外にも出られずモンモンとしているので,作業します。
今日の作業は下の表のような複数のCSVファイルをタイトルとインデックスを除いたデータのみ取り出して上下に繋げて一つのCSVファイルにします。
表1 加工するCSVファイル
Title | ||||||||||
年月日 | 項目1 | 項目2 | 項目3 | 項目4 | 項目5 | 項目6 | 項目7 | 項目8 | 項目9 | 項目10 |
4月10日 | a | b | c | d | e | f | g | h | i | j |
どうするか,というと
まずは,catで各ファイルを読み込んでみます。
エクセルで作成(?)したファイルなので,Shift-jis。なので,nkf -wでUTF-8に変換後にcat。すると"Title",・・\n "4月10日",・・・・と,ダブルクォーテーションが付いてしまう。
sed 's/"//g' で除去し,と思ったら,数字の千区切りの","がフィールド区切りと認識してしまうので,よろしくない。
""は残してフィールド区切りにし,奇数列を除去が良いか・・・
sed 's/"/@/g' P03031003-200408.csv | awk 'BEGIN{FS="@"}NR>2{print}' | sed 's/,//g' | awk 'BEGIN{FS="@";OFS=","}{print $2,$4,$6,$8,$10,$12,$14,$16,$18,$20,$22,$24,$26,$28,$30}' > test.csv
で15列目までできるんだけど。かなり冗長。しかも,同一フォルダのファイル全てに一括変換できない。for i in f$.csv とか使えばできるけど面倒。パイプを区切ってひとつづつやるかなぁ・・・
なにか良いアイデアある人いたらコメねがいますm__m