テキスト内容をCSVに再フォーマットします。

テキスト内容をCSVに再フォーマットします。

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

おすすめ記事