bisogno di trovare e sostituire usando le espressioni regolari in TextWrangler - grep, per un file CSV
-
14-10-2019 - |
Domanda
Ho questo file CSV, testo semplice qui: http://pastie.org/1425970
Come appare in Excel: http://cl.ly/3qXk
Un esempio di quello che vorrei che per assomigliare (usando solo la prima riga come esempio): http: // cl .ly / 3qYT
Testo normale di prima fila: http://pastie.org/1425979
Ho bisogno di creare un file CSV, per importare tutte le informazioni in una tabella di database.
ho potuto creare manualmente il csv, ma ho voluto vedere se era possibile realizzare questo utilizzando espressioni regolari in TextWrangler (grep) trovare e sostituire
Soluzione
Le espressioni regolari non sono davvero il modo migliore per ottenere questo risultato. Come altri hanno notato, è meglio scrivere del codice per analizzare il file nel formato desiderato.
Detto questo, questa brutta regex dovrebbe arrivare a metà strada:
Trova:
(\d+),"?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?(?:(\d+),? ?)?"?
Sostituire:
\1,\2\r\1,\3\r\1,\4\r\1,\5\r\1,\6\r\1,\7\r\1,\8
Il che vi lascerà con alcune righe in più, come di seguito:
1,1
1,8
1,11
1,13
1,
1,
1,
2,10
2,11
2,12
2,
2,
...
È possibile pulire le righe in più a mano, o con la seguente espressione regolare:
Trova:
\d+,\r
Sostituire:
(empty string)
Altri suggerimenti
Utilizzo di Perl, si potrebbe fare qualcosa di simile:
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);
Non so TextMate. Ma in generale posso descrivere quello che serve per fare questo in pseudo-codice.
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, qualcosa di simile ..
while ($line = <DATA> ) {
chomp $line;
@data_array = split /[, "]+/, $line;
for $otherfield ( @data_array[ 1 .. $#data_array ]) {
print "$data_array[0], $otherfield\n";
}
}
Dovrebbe essere facile se si dispone di una capacità di divisione.