Mam plik .CSV, który zawiera długą linię danych. Dane wyglądają coś wzdłuż linii:

Name,Gender,Age John Smith,M,23 Ashley Jones,F,18 James Smith Johns,M,20

Moim celem jest oddzielenie wszystkich danych, więc mogę umieścić je w rzędy. Mój zamierzony wynik byłby:

['Name','Gender','Age','John Smith','M','23','Ashley Jones','F','18','James Smith Jones','M','20']

Jednak przy użyciu czegoś takiego:

line = line.split(",")
line = line.split(" ")

Nie będzie działać, ponieważ oddzieli je na miejscu lub przestrzeni, a także będą takie wartości:

'Age John Smith' or 'Age','John','Smith'

Czy jest jakiś sposób na pracę?

0
Web Hopeful 25 listopad 2013, 21:21

4 odpowiedzi

Najlepsza odpowiedź

Najpierw podzielony na ,, a następnie iteruj na tę listę i podzielić na każdym przedmiocie w Whitespaces. Jeśli po rozdzieleniu w różnych znakach liczbę zwróconych elementów jest więcej niż 1, zwróć pierwszy element i pozostałe elementy oddzielnie w inny sposób po prostu zwróć pierwszy element.

import csv
def solve(row):
    for item in row:
        spl = item.split(None, 1)
        if len(spl) > 1:
            yield spl[0]
            yield spl[1]           
        else:
            yield spl[0]
...             
with open('abc1') as f:
    reader = csv.reader(f, delimiter=',')
    for row in reader:      
        print list(solve(row))
...         
['Name', 'Gender', 'Age', 'John Smith', 'M', '23', 'Ashley Jones', 'F', '18', 'James Smith Johns', 'M', '20']
4
Ashwini Chaudhary 25 listopad 2013, 17:35

Są ładne re - rozwiązania, ale chciałem tylko dodać ten roztwór non-regex:

>>> s = "John Smith,M,23 Ashley Jones,F,18 James Smith Johns,M,20"
>>> sum((item.split(None, 1) for item in s.split(',')), list())
['Name', 'Gender', 'Age', 'John Smith', 'M', '23', 'Ashley Jones', 'F', '18', 'James Smith Johns', 'M', '20']

Zamiast sum, możesz również użyć itertools.chain. Ale w końcu nie wydaje się być krótszy.

>>> list(itertools.chain(*[item.split(None, 1) for item in s.split(',')]))

Albo lepiej

>>> list(itertools.chain.from_iterable(item.split(None, 1) for item in s.split(',')))
1
koffein 25 listopad 2013, 18:25

Jak widzę w przykładzie linii będzie line = line.split(",") enoght. Może coś nie dostałem?

-1
greg 25 listopad 2013, 17:26

Regularny sposób ekspresyjny. :-)

>>> s = "John Smith,M,23 Ashley Jones,F,18 James Smith Johns,M,20" #Note: no title here.
>>> [(x.group(1), x.group(3), x.group(4)) for x in re.finditer(r"(\S+( \S+)),(\S),(\d+)",s)]
[('John Smith', 'M', '23'), ('Ashley Jones', 'F', '18'), ('Smith Johns', 'M', '20')]

Należy pamiętać, że usunąłem tytuł (pierwsza linia), musisz odpowiednio zmodyfikować regexp lub zmodyfikować ciąg wejściowy.

0
UltraInstinct 25 listopad 2013, 17:40