2009-05-11 8 views
2

J'ai un fichier CSV qui a seulement 1 colonne, mais a près de 1500 enregistrements.Extraire le texte du fichier CSV

Je voudrais extraire des informations de chaque enregistrement, par exemple,

« La batterie de l'échantillon a une tension: 11.1V et capacité: 4500mAh »

Je voudrais en extraire et 11.1 placer dans un autre fichier, c'est-à-dire après "voltage:", avant "V". Si l'enregistrement n'a pas de "voltage:", je voudrais avoir une ligne vide dedans.

Je suis dans un environnement Linux, quelle est la manière la plus simple de le faire?

+2

Il semble que votre fichier contient deux colonnes (il y a une virgule dedans) –

+0

Est-ce que je comprends bien? Chaque ligne de ce fichier CSV ressemble à celle que vous avez décrite? Donc tout d'abord, nous devons vérifier si «Voltage:» et «V» existent, puis chercher le numéro entre et l'exporter vers un autre fichier? – Javier

+1

Assaf, cela dépend si vous suivez la convention CSV que les instructions entre guillemets sont des chaînes qui peuvent contenir des virgules – simon

Répondre

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]),) 

vous initieront à tirer des données à partir d'un fichier CSV.


Apparemment (basé sur les commentaires) le fichier ressemble à ceci.

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

Ce qui pourrait être un fichier CSV à 1 colonne. Ou une seule ligne avec des citations de bonus. Imaginons que ce soit un fichier CSV à 1 colonne.

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 

Quelque chose comme ça pourrait être approprié.

+0

Salut, c'est exactement l'opposé de ce que j'ai l'intention de faire. Fondamentalement, c'est un fichier CSV d'un panier (exporté avec phpMyAdmin), et je veux extraire les numéros à la place. Ainsi, à chaque fois que le programme voit "Voltage:", il extraira le nombre réel (virgule flottante dans ce cas) juste après. – segfault

+2

Veuillez clarifier votre question, pour inclure cette nouvelle information. –

2

Je ne sais pas exactement ce que vous entendez par un fichier CSV à une seule colonne; s'il a une seule colonne, n'est-ce pas un fichier texte?

Quoi qu'il en soit, si chaque ligne ressemble au-dessus et nous avons un fichier comme celui-ci:

 
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 

Ensuite, vous pouvez obtenir cette bande facilement le 11.1 avec une expression rationnelle et de conserver l'indexation avec comme ceci:

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

12.1 

Ce qui peut être ajusté si j'ai mal compris le format des lignes ne contenant pas de tension. Notez que mes expressions sont très fragiles par rapport à votre mise en forme et peuvent être améliorées. Notez également que je n'ai pas inclus les citations, car votre intention n'était pas claire. Ce qui précède doit être (trivialement) ajusté pour fonctionner avec eux.

Questions connexes