Frage

Ich bin das importieren von Daten aus einer CSV Datei und zahlen, die größer sind als 1000 Holen Sie sich in 1,100 etc.

Was ist ein guter Weg, um entfernen Sie die Anführungszeichen und Komma von diesem, so kann ich es in einer int Feld?

Edit:

Die Daten tatsächlich bereits in einer MySQL-Tabelle, und so brauche ich in der Lage, diese mithilfe von SQL.Sorry für die Verwechslung.

War es hilfreich?

Lösung

Hier ist ein gutes Beispiel für reguläre Ausdrücke.Sie laufen können, ein suchen und ersetzen auf die Daten, bevor Sie importieren (einfacher) oder später auf, wenn die SQL-import akzeptiert diese Zeichen (nicht so leicht).Aber in beiden Fällen müssen Sie eine beliebige Anzahl von Methoden, um eine suchen-und-ersetzen, sei es Editoren, Script-Sprachen, GUI-Programme, etc.Denken Sie daran, dass Sie gehen zu wollen, zu suchen und zu ersetzen alle der schlechte Zeichen.

Eine typische regulären Ausdruck zu finden, das Komma und Anführungszeichen (vorausgesetzt, nur doppelte Anführungszeichen), ist: (Blacklist)

/[,"]/

Oder, wenn Sie finden etwas in der Zukunft ändern könnte, dieser reguläre Ausdruck, der passt nichts außer eine Zahl oder dezimal-Punkt. (Whitelist -)

/[^0-9\.]/

Was diskutiert wurde von den Menschen vor ist, dass wir nicht wissen, alle die Daten in Ihrer CSV-Datei.Es klingt wie Sie wollen zu entfernen Sie die Kommas und Anführungszeichen aus allen zahlen in der CSV-Datei.Aber weil wir nicht wissen, was sonst noch in der CSV-Datei, die wir wollen sicherstellen, dass wir nicht korrupt anderen Daten.Einfach blind zu tun, ein suchen/ersetzen, könnte Auswirkungen auf andere Teile der Datei.

Andere Tipps

Meine Vermutung hier ist, dass, weil die Daten importieren können, dass das Feld eigentlich eine varchar-Datentyp oder einige Zeichen ein, weil Sie auf ein numerisches Feld kann versagt haben.Hier war ein test, Fall ich lief rein eine MySQL -, SQL-Lösung.

  1. Die Tabelle ist nur eine einzelne Spalte (alpha), ist ein varchar.

    mysql> desc t;
    
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | alpha | varchar(15) | YES  |     | NULL    |       | 
    +-------+-------------+------+-----+---------+-------+
    
  2. Fügen Sie einen Datensatz hinzu

    mysql> insert into t values('"1,000,000"');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from t;
    
    +-------------+
    | alpha       |
    +-------------+
    | "1,000,000" | 
    +-------------+
    
  3. Update-Anweisung.

    mysql> update t set alpha = replace( replace(alpha, ',', ''), '"', '' );
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from t;
    
    +---------+
    | alpha   |
    +---------+
    | 1000000 | 
    +---------+
    

So dass am Ende die Aussage, die ich verwendet wurde, war:

UPDATE table
   SET field_name = replace( replace(field_name, ',', ''), '"', '' );

Ich schaute auf die MySQL-Dokumentation und es sah nicht wie ich das tun könnte, die reguläre Ausdrücke finden und ersetzen Sie.Sie könnten zwar, wie Eldila, verwenden Sie einen regulären Ausdruck für einen finden, und dann eine alternative Lösung zu ersetzen.


Seien Sie auch vorsichtig mit s/"(\d+),(\d+)"/$1$2/ denn was ist, wenn die Zahl hat sich mehr als nur ein Komma, zum Beispiel "1,000,000" Sie gehen zu wollen, zu tun, eine Globale ersetzen (die in perl s///g).Aber auch mit einer globalen ersetzen Sie das Ersatz-fängt dort an, wo Sie zuletzt aufgehört haben (es sei denn, perl ist unterschiedlich), und vermissen würde, die alle anderen durch Komma getrennte Gruppe.Eine mögliche Lösung wäre die erste (\d+) optional wie so s/(\d+)?,(\d+)/$1$2/g und in diesem Fall würde ich einen zweiten suchen und ersetzen strip-Zitate.

Hier sind einige ruby-Beispiele für reguläre Ausdrücke handeln, die nur auf die Zeichenfolge "1,000,000", beachten Sie, dass es sind KEINE doppelten Anführungszeichen innerhalb der Zeichenfolge, das ist nur ein string, der die Zahl selbst.

>> "1,000,000".sub( /(\d+),(\d+)/, '\1\2' )
# => "1000,000"  
>> "1,000,000".gsub( /(\d+),(\d+)/, '\1\2' )
# => "1000,000"  
>> "1,000,000".gsub( /(\d+)?,(\d+)/, '\1\2' )
# => "1000000"  
>> "1,000,000".gsub( /[,"]/, '' )
# => "1000000"  
>> "1,000,000".gsub( /[^0-9]/, '' )
# => "1000000"

Sie könnte verwenden Sie diesen Befehl perl.

Perl -lne 's/[,|"]//; print' file.txt > newfile.txt

Möglicherweise müssen Sie spielen, um mit ihm ein bisschen, aber es sollte den trick tun.

Hier ist der PHP-Art:

$stripped = str_replace(array(',', '"'), '', $value);

Link zur Seite W3Schools

Eigentlich nlucaroni, Ihren Fall nicht ganz richtig ist.Ihr Beispiel nicht zählen Doppel-Anführungszeichen, so

id,age,name,...
1,23,phil,

übereinstimmen, wird nicht mein regex.Es erfordert das format "XXX,XXX".Ich kann mich nicht an ein Beispiel denken, Wann es passen nicht richtig.

Alle im folgenden Beispiel nicht die deliminator in der regex:

"111,111",234
234,"111,111"
"111,111","111,111"

Bitte lassen Sie mich wissen, wenn Sie denken können, ein gegen-Beispiel.

Cheers!

Die Lösung für die geänderte Frage ist im Grunde das gleiche.

Sie haben select-Abfrage mit der regex-where-Klausel.

So etwas wie

Select *
  FROM SOMETABLE
  WHERE SOMEFIELD REGEXP '"(\d+),(\d+)"'

Foreach dieser Zeilen, die Sie wollen zu tun die folgenden regex-substitution s/"(\d+),(\d+)"/$1$2/ und aktualisieren Sie das Feld mit dem neuen Wert.

Bitte Joseph Pecoraro ernst und haben Sie ein backup, bevor Sie die massenänderung von Dateien oder Datenbanken.Weil, Wann auch immer Sie tun, regex, können Sie ernsthaft Durcheinander Daten, wenn es Fälle gibt, die Sie verpasst haben.

Mein Befehl entfernt alle ',' und '"'.

Um zu konvertieren, die sting "1,000" mehr streng, müssen Sie den folgenden Befehl aus.

Perl -lne 's/"(\d+),(\d+)"/$1$2/; print' file.txt > newfile.txt

Daniel und Eldila Antwort haben ein problem:Entfernen Sie alle Anführungszeichen und Kommas in der gesamten Datei.

Was ich normalerweise Tue, wenn ich etwas tun wie diese ist die erste " alle ersetzen Trennung Zitate und (in der Regel) Semikolon getrennt durch Tabulatoren.

  • Suche: ";"
  • Ersetzen:

Da ich weiß, in welche Spalte mein betroffenen Werte ich dann noch ein suchen und ersetzen:

  • Suche: ^([ ]+) ([ ]+) ([0-9]+),([0-9]+)
  • Ersetzen: \1 \2 \3\4

...den Wert mit dem Komma in der Dritten Spalte.

Sie müssen anfangen, mit einem "^", um sicherzustellen, dass es beginnt am Anfang einer Zeile.Dann sind Sie zu wiederholen ([0-9]+) ", da oft als Spalten vorhanden sind, die Sie gerade verlassen wollen, als Sie sind.

([0-9]+),([0-9]+) sucht nach Werten, wo es ist eine Zahl, dann ein Komma und dann eine andere Nummer.

In der ersetzen-Zeichenkette verwenden wir \1 und \2, nur halten die Werte, die aus der bearbeiteten Zeile, die Sie mit (tab).Dann setzen wir \3\4 (keine tab-zwischen), um die beiden Komponenten der Zahl ohne das Komma direkt nach einander.Alle Werte danach wird in Ruhe gelassen werden.

Wenn Sie brauchen Ihre Datei mit Semikolon zum trennen der Elemente, die Sie dann gehen können, auf und ersetzen Sie die Registerkarten mit Semikolons.Aber dann - wenn man die Anführungszeichen - Sie haben zu stellen Sie sicher, dass die Textwerte enthalten keine Semikolons selber.Das ist, warum ich lieber mit der TAB-Zeile markieren.

Normalerweise mache ich das in einem normalen text-editor (EditPlus) unterstützt, RegExp, aber die gleichen regexps kann verwendet werden in einer beliebigen Programmiersprache.

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