Frage

Lassen Sie mich dies vorbereiten, indem Sie sagen, dass ich ein vollständiger Amateur bin, wenn es um Regex geht und erst vor ein paar Tagen begonnen habe. Ich versuche, ein Problem zu lösen, das eine Datei formatiert, und habe mit einer bestimmten Datentype auf ein Problem geschlagen. Die Eingabedatei ist so strukturiert:

Two words,Word,Word,Word,"Number, number"

Was ich tun muss, ist es so formatieren ...

"Two words","Word",Word","Word","Number, number"

Ich hatte ein Regex -Muster von

s/,/","/g

Arbeiten, außer es ersetzt das Komma auch in der bereits zitierten Nummer, Nummer, die dazu führt, dass das Feld sich trennen und die Datei unterbricht. Im Wesentlichen muss ich mein Muster ändern, um ein Komma durch "", "Quote Comma -Zitat" zu ersetzen, aber nur, wenn dieses Komma nicht von einem Raum verfolgt wird. Beachten Sie, dass die anderen Felder niemals einen Platz nach dem Komma haben werden, nur die abgrenzte Zahlenliste.

Ich habe es geschafft zu schreiben

s/,[A-Za-z0-9]/","/g

was beim Abgleich der entsprechenden Zeichenfolgen das Komma und den folgenden Brief ersetzen würde. Ich habe von Hinterläden gehört und dachte, das könnte das sein, was ich verwenden muss? Mein Verständnis war das

s/(,)[A-Za-z0-9]\b

Sollte funktionieren, aber es tut es nicht.

Hat jemand eine Idee?

War es hilfreich?

Lösung

s/,([^ ])/","$1/ wird mit einem "übereinstimmen","Gefolgt von einem" Not-a-Space ", der den Not-a-Raum erfasst und dann das Ganze durch den erfassten Teil ersetzt.

Je nachdem, welchen Regex -Engine Sie verwenden, schreiben Sie möglicherweise \1 oder andere Dinge anstelle von $1.

Wenn Sie Perl verwenden oder auf andere Weise Zugriff auf einen Regex -Motor mit negativem Lookahead haben, s/,(?! )/","/ (a ","Nicht gefolgt von einem Raum) funktioniert.

Ihre Eingabe sieht jedoch wie CSV aus, und wenn dies tatsächlich ist, sollten Sie ihn besser mit einem echten CSV -Parser als mit Regexes analysieren. Es gibt viele andere seltsame Eckfälle, über die man sich Sorgen machen muss.

Andere Tipps

Meine Erfahrung war, dass dies keine große Verwendung von Regexes ist. Wie bereits erwähnt, werden CSV -Dateien von echten CSV -Parsers besser behandelt. Sie haben keine Sprache gekennzeichnet, daher ist es schwer zu sagen, aber in Perl verwende ich Text :: csv_xs oder dbd :: csv (so erlaubt mir SQL, auf eine CSV -Datei zuzugreifen, als wäre es eine Tabelle, die natürlich. Verwendet Text :: csv_xs unter den Covers). Weit einfacher als mein eigenes und weitaus robuster als die Verwendung von Regexes.

Diese Frage ähnelt: Ersetzen Sie Muster, die sich in Grenzwerten unter Verwendung eines regulären Ausdrucksaufrufs befinden.

Dies könnte funktionieren:

s/"([^"]*)"|([^",]+)/"$1$2"/g

Sieht so aus, als würden Sie SED verwenden.

Während Ihr Muster ein wenig inkonsistent zu sein scheint, gehe ich davon aus, dass Sie möchten, dass jeder von Kommas getrennte Gegenstand Zitate um sie herum hat. Andernfalls prüfen Sie Bereiche der rechnerischen Komplexität, die reguläre Ausdrücke nicht verarbeiten sollen.

Durch SED wäre Ihr Befehl:

  sed 's/[ \"]*,[ \"]*/\", \"/g'

Beachten Sie, dass Sie am Anfang und am Ende der Zeichenfolge noch Doppelquoten einstellen müssen.

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