bisogno di trovare e sostituire usando le espressioni regolari in TextWrangler - grep, per un file CSV

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

  •  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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top