CSVファイルの場合、TextWrangler -grepで正規表現を使用して見つけて交換する必要があります
-
14-10-2019 - |
質問
私はこのCSVファイル、ここにプレーンテキストを持っています: http://pastie.org/1425970
Excelでどのように見えるか: http://cl.ly/3qxk
私がそれをどのように見せたいかの例(例として最初の行を使用するだけです): http://cl.ly/3qyt
最初の行のプレーンテキスト: http://pastie.org/1425979
すべての情報をデータベーステーブルにインポートするには、CSVファイルを作成する必要があります。
CSVを手動で作成できましたが、TextWrangler(GREP)の正規表現を使用してこれを達成できるかどうかを確認したかったのです。
解決
正規表現は、これを達成するための最良の方法ではありません。他の人が指摘したように、ファイルを必要な形式に解析するために、いくつかのコードを書く方がよいでしょう。
そうは言っても、この醜い正規表現はあなたを途中に連れて行くはずです:
探す:
(\d+),"?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?"?
交換:
\1,\2\r\1,\3\r\1,\4\r\1,\5\r\1,\6\r\1,\7\r\1,\8
以下のように、いくつかの追加の行が残ります。
1,1
1,8
1,11
1,13
1,
1,
1,
2,10
2,11
2,12
2,
2,
...
余分な行を手作業でクリーンアップするか、次の正規表現を使用できます。
探す:
\d+,\r
交換:
(empty string)
他のヒント
Perlを使用して、次のようなことができます。
open(my $read,"<","input.csv") or die ("Gah, couldn't read input.csv!\n");
open(my $write,">","output.csv") or die ("WHAAAARGARBL!\n");
while(<$read>)
{
chomp;
if(/(\d+),"(.*)"/)
{
my @arr=split(/,/,$2);
foreach(@arr)
{
print $write $1.",".$2."\n";
}
}
}
close($read);
close($write);
私はテキストメイトを知りません。しかし、一般的に、私はこれを擬似コードで行うために必要なことを説明できます。
loop, read each line
strip off the newline
split into an array using /[, "]+/ as delimeter regex
loop using result. an array slice from element 1 to the last element
print element 0, comma, then itterator value
end loop
end loop
Perlで、このようなもの。
while ($line = <DATA> ) {
chomp $line;
@data_array = split /[, "]+/, $line;
for $otherfield ( @data_array[ 1 .. $#data_array ]) {
print "$data_array[0], $otherfield\n";
}
}
分割機能がある場合は簡単です。