Müssen Sie mit regulären Ausdrücken in Textwrangler - Grep für eine CSV -Datei ersetzen und ersetzen
-
14-10-2019 - |
Frage
Ich habe diese CSV -Datei, einfacher Text hier: http://pastie.org/1425970
Wie es in Excel aussieht: http://cl.ly/3qxk
Ein Beispiel dafür, wie ich es aussehen möchte (nur die erste Zeile als Beispiel verwenden): http://cl.ly/3qyt
Einfacher Text der ersten Zeile: http://pastie.org/1425979
Ich muss eine CSV -Datei erstellen, um alle Informationen in eine Datenbanktabelle zu importieren.
Ich konnte das CSV manuell erstellen, aber ich wollte sehen, ob es möglich war, dies mit regelmäßigen Ausdrücken in Textwrangler (GREP) zu erreichen und zu ersetzen
Lösung
Regelmäßige Ausdrücke sind nicht wirklich der beste Weg, um dies zu erreichen. Wie andere bemerkt haben, schreiben Sie besser Code, um die Datei in das gewünschte Format zu analysieren.
Trotzdem sollte sich diese hässliche Regex dort auf halbem Weg bringen:
Finden:
(\d+),"?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?"?
Ersetzen:
\1,\2\r\1,\3\r\1,\4\r\1,\5\r\1,\6\r\1,\7\r\1,\8
Dies lässt Sie mit einigen zusätzlichen Zeilen wie unten:
1,1
1,8
1,11
1,13
1,
1,
1,
2,10
2,11
2,12
2,
2,
...
Sie können die zusätzlichen Zeilen von Hand oder mit dem folgenden Regex aufräumen:
Finden:
\d+,\r
Ersetzen:
(empty string)
Andere Tipps
Mit Perl könnten Sie so etwas tun:
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);
Ich kenne Textkamerad nicht. Aber im Allgemeinen kann ich beschreiben, was es braucht, um dies in Pseudo-Code zu tun.
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
In Perl so etwas ..
while ($line = <DATA> ) {
chomp $line;
@data_array = split /[, "]+/, $line;
for $otherfield ( @data_array[ 1 .. $#data_array ]) {
print "$data_array[0], $otherfield\n";
}
}
Es sollte einfach sein, wenn Sie eine geteilte Fähigkeit haben.