Müssen Sie mit regulären Ausdrücken in Textwrangler - Grep für eine CSV -Datei ersetzen und ersetzen

StackOverflow https://stackoverflow.com/questions/4586414

  •  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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top