2009-05-11 18 views
2

Ich habe eine CSV-Datei, die nur 1 Spalte hat, aber fast 1500 Datensätze hat.Text aus der CSV-Datei extrahieren

Ich möchte Informationen aus jedem Datensatz extrahieren, zB

„Die Probe Batterie hat eine Spannung: 11,1 V und Kapazität: 4500mAh“

Ich möchte 11.1 extrahieren und in eine andere Datei einfügen, dh nach "spannung:", vor "V". Wenn der Datensatz nicht "Spannung:" hat, würde ich gerne eine leere Zeile darin haben.

Ich bin in einer Linux-Umgebung, was ist der einfachste Weg, es zu tun?

+2

Es scheint, dass Ihre Datei zwei Spalten enthält (dort ist ein Komma) –

+0

Bekomme ich das richtig? Jede Zeile in dieser CSV-Datei ähnelt der von Ihnen beschriebenen Zeile. Also müssen wir zuerst prüfen, ob 'Voltage:' und 'V' existieren, dann nach der Nummer dazwischen suchen und sie in eine andere Datei exportieren? – Javier

+1

Assaf, das hängt davon ab, ob Sie der CSV-Konvention folgen, dass zitierte Anweisungen Zeichenketten sind, die Kommas enthalten können. – simon

Antwort

2

Python

import csv 
source = open("myfile.csv", "rb") 
rdr= csv.reader(source) 
for row in rdr: 
    print "The sample battery has a Voltage: %.1fV, and capacity: %dmAh" % (float(row[0]), int(row[1]),) 

Werden Sie mit dem Ziehen von Daten aus einer CSV-Datei gestartet.


Offenbar (basierend auf Kommentaren) sieht die Datei so aus.

"The sample battery has a Voltage: 11.1V, and capacity: 4500mAh" 

Welche könnte eine 1-Spalte CSV sein. Oder eine einzelne Zeile mit Bonuszitaten. Nehmen wir an, es ist eine 1-Spalten-CSV.

import csv 
import re 
v_pat= re.compile(r' (\d+\.\d+)V') 
mah_pat = re.compile(r' (\d+)mAh') 
source = open("myfile.csv", "rb") 
rdr= csv.reader(source) 
for row in rdr: 
    v_match= v_pat.search(row[0]) 
    mah_match= mah_pat.search(row[0]) 
    if v_match and mah_match: 
     print v_match.group(1), mah_match.group(1) 
    else: 
     print # empty line -- not very informative 

So etwas könnte angebracht sein.

+0

Hallo, das ist genau das Gegenteil von dem, was ich vorhabe. Grundsätzlich ist es eine CSV-Datei aus einem Einkaufswagen (exportiert mit phpMyAdmin), und ich möchte stattdessen die Zahlen extrahieren. So ist es wie immer, wenn das Programm "Spannung:" sieht, würde es die reelle Zahl (Fließkomma in diesem Fall) direkt danach extrahieren. – segfault

+2

Bitte klären Sie Ihre Frage, um diese neuen Informationen aufzunehmen. –

2

Ich bin nicht sicher, was genau Sie mit einer einzelnen Spalte CSV-Datei meinen; Wenn es eine einzelne Spalte hat, ist das nicht nur eine Textdatei?

Wie auch immer, wenn jede Zeile sieht aus wie oben, und wir haben eine Datei wie folgt aus:

 
bash-3.2$ cat example.txt 
The sample battery has a Voltage: 11.1V, and capacity: 4500mAh 
The sample battery has some other info but no v entry 
The sample battery has a Voltage: 12.1V, and capacity: 4200mAh 

Dann können Sie dies erreichen leicht die 11.1 mit einem regexp Streifen aus und behalten die Indizierung mit wie folgt aus:

 
bash-3.2$ sed -e 's/.*Voltage: \([^V]*\)V.*/\1/' -e 's/^The.*//' < example.txt 
11.1 

12.1 

Das kann eingestellt werden, wenn ich das Format der nicht spannungsführenden Zeilen missverstanden habe. Beachten Sie, dass meine Ausdrücke in Bezug auf Ihre Formatierung sehr fragil sind und verbessert werden können. Beachten Sie auch, dass ich keine Zitate angegeben habe, da Ihre Absicht unklar war. Das Obige muss (trivial) angepasst werden, um mit ihnen zu arbeiten.