CSVに変換したいテキストファイルがあります。その内容の形式は次のとおりです。
1 mm/dd/yyyy
LastName, FirstName MiddleName
ID-NUMBER-HERE
GENDER
2 mm/dd/yyyy
LastName, FirstName MiddleName
ID-NUMBER-HERE
GENDER
- 1番と2番は各グループの行番号です。削除したいです。
- 日付は誕生日です。別の形式に置き換える方法はありますか?
- 名前:その人の名前またはプレフィックスが 2 つであればどうなりますか?私はそれらをすべて1列に入れたいです。ミドルネームと姓にも同じです。
ファイルサイズは26MBです。
私が望む結果の形式は次のとおりです。
'yyyy-mm-dd','LastName','FirstName','MiddleName','ID-NUMBER','GENDER'
SEDや他のツールを使ってこれを行う方法はありますか?
私はSEDについて学びましたが、私が自分でやろうとしたら、はるかに長い時間がかかりました。
誰でも助けることができますか?
ところで、私はMacを使っています。
ありがとうございます!
アルビン
ベストアンサー1
これは、各行を読み取り、それをフィールド(@line配列)に分割して@out配列に追加するPerlスクリプトです。 @outに6つのフィールドがある場合は、それを印刷します。
注:これは非常に基本的なCSVなので、文字列などを引用符で囲む必要はありません。フィールドにフィールド区切り文字(カンマなど)が含まれていない場合は、引用符は必要ありません,
。高度なCSVの場合、Text::CSV
またはPerlモジュールを使用するように変更する必要がありますDBD::CSV
。
また、姓、名、中間の名前にはそれぞれ1単語しかないとします。
#! /usr/bin/perl
use strict;
my @out = ();
while(<>) {
my @line = split /,?\s+/;
my $numfields=@line - 1;
if ($line[0] =~ m/^\d+$/) {
push @out, $line[1];
} elsif ($numfields > 1) {
push @out, (@line[0..1], join(" ",@line[2..$numfields]));
} else {
push @out, @line
}
if ( @out == 6 ) { print join(",",@out),"\n" ; @out=() } ;
}
サンプル出力(次に保存したサンプル入力を使用するinput.txt
:
$ ./convert-to-csv.pl input.txt
mm/dd/yyyy,LastName,FirstName,MiddleName,ID-NUMBER-HERE,GENDER
mm/dd/yyyy,LastName,FirstName,MiddleName,ID-NUMBER-HERE,GENDER