2017-08-16 4 views
0

I-Code nach der Verwendung CSV-Datei ist abhängig von Haupt .csv Spalte 8 aufzuspalten:Spliting .csv fügen zusätzliche Spalte für jede neue CSV-

import csv 
import pandas as pd  

def spliteCsv(input,output): 
    print(input) 
    data=set() 
    with open (input) as csvfile: 
     file = csv.reader (csvfile,delimiter=',') 
     next (file,None) 
     for row in file: 
      if row[7] =='': 
       data.add (-1) 
      else: 
       data.add (int(row[7])) 

    data = list(data) 
    ofile = pd.read_csv (input, sep=',') 
    data.append(max(data)+1) 
    for d in data: 
     csv_temp = ofile[ofile['col8'].fillna (max(data)).astype(int) == d] 
     csv_temp.to_csv ('%s_%s.csv'%(output,d),sep=',') 
    return 

hier ist das, was ich brauche:

col1 col2 col3 col4 col5 col6 col7 col8 col9 
1  a  k8       5 
2  j  l9       5 
3  k  o0       5 
4  l  m7       5 

und hier ist der Code-Ausgang:

col0 col1 col2 col3 col4 col5 col6 col7 col8 col9 
0  1  a  k8       5 
1  2  j  l9       5 
2  3  k  o0       5 
3  4  l  m7       5 

, wie Sie verstehen, es zusätzliche Spalte als erste Spalte einzufügen, dieenthält

Edit:

source.csv:

frame.number frame.time_epoch  ip.src   ip.dst  tcp.srcport  tcp.dstport  tcp.seq  tcp.stream  frame.len  tcp.flags  _ws.col.Info 
    1   1501756607   192.168.1.10 37.48.64.201  47159   7095  1    1   215    0x00000018  47159 → 7095 [PSH, ACK] Seq=1 Ack=1 Win=2235 Len=149 TSval=19928932 TSecr=2777283254 
    2   1501756607   37.48.64.201 192.168.1.10  7095   47159  1    2   66    0x00000010  7095 → 47159 [ACK] Seq=1 Ack=150 Win=91 Len=0 TSval=2777285491 TSecr=19928932 
    3   1501756607   37.48.64.201 192.168.1.10  7095   47159  1    1   215    0x00000018  7095 → 47159 [PSH, ACK] Seq=1 Ack=150 Win=91 Len=149 TSval=2777285491 TSecr=19928932 
    4   1501756607   192.168.1.10 37.48.64.201  47159   7095  150    2   215    0x00000018  47159 → 7095 [PSH, ACK] Seq=150 Ack=150 Win=2235 Len=149 TSval=19928977 TSecr=2777285491 
    5   1501756607   192.168.1.10 37.48.64.201  47159   7095  299    2   343    0x00000018  47159 → 7095 [PSH, ACK] Seq=299 Ack=150 Win=2235 Len=277 TSval=19928979 TSecr=2777285491 
    6   1501756607   37.48.64.201 192.168.1.10  7095   47159  150       66    0x00000010  7095 → 47159 [ACK] Seq=150 Ack=576 Win=91 Len=0 TSval=2777285537 TSecr=19928977 

Ausgabedateien:

Datei 1:

frame.number frame.time_epoch  ip.src   ip.dst  tcp.srcport  tcp.dstport  tcp.seq  tcp.stream  frame.len  tcp.flags  _ws.col.Info 
    1   1501756607   192.168.1.10 37.48.64.201  47159   7095  1    1   215    0x00000018  47159 → 7095 [PSH, ACK] Seq=1 Ack=1 Win=2235 Len=149 TSval=19928932 TSecr=2777283254 
    3   1501756607   37.48.64.201 192.168.1.10  7095   47159  1    1   215    0x00000018  7095 → 47159 [PSH, ACK] Seq=1 Ack=150 Win=91 Len=149 TSval=2777285491 TSecr=19928932 

Datei 2:

frame.number frame.time_epoch  ip.src   ip.dst  tcp.srcport  tcp.dstport  tcp.seq  tcp.stream  frame.len  tcp.flags  _ws.col.Info 
    2   1501756607   37.48.64.201 192.168.1.10  7095   47159  1    2   66    0x00000010  7095 → 47159 [ACK] Seq=1 Ack=150 Win=91 Len=0 TSval=2777285491 TSecr=19928932 
    4   1501756607   192.168.1.10 37.48.64.201  47159   7095  150    2   215    0x00000018  47159 → 7095 [PSH, ACK] Seq=150 Ack=150 Win=2235 Len=149 TSval=19928977 TSecr=2777285491 
    5   1501756607   192.168.1.10 37.48.64.201  47159   7095  299    2   343    0x00000018  47159 → 7095 [PSH, ACK] Seq=299 Ack=150 Win=2235 Len=277 TSval=19928979 TSecr=2777285491 

Datei 3:

frame.number frame.time_epoch  ip.src   ip.dst  tcp.srcport  tcp.dstport  tcp.seq  tcp.stream  frame.len  tcp.flags  _ws.col.Info 
    6   1501756607   37.48.64.201 192.168.1.10  7095   47159  150    3   66    0x00000010  7095 → 47159 [ACK] Seq=150 Ack=576 Win=91 Len=0 TSval=2777285537 TSecr=19928977 
+0

Ich denke, es ein besserer ist (__vectorized__) Weg, dies zu tun ... Können Sie Ihre Quell-CSV-Datei posten, anhand derer Sie den gewünschten Datensatz aus Ihrer Frage erhalten? – MaxU

+0

Der erfasste Datenverkehr im CSV-Format mit den folgenden Kopfzeilen: frame.number, frame.time_epoch, ip.src, ip.dst, tcp.srcport, tcp.dstport, tcp.seq, tcp.stream, frame.len, tcp .flags, _ws.col.Info. die alle in einer Zeichenfolge gespeichert werden. und ich spalte hängt von tcp.stream Nummer ab. – user3806649

+0

Können Sie [Ihre Frage aktualisieren] (https://stackoverflow.com/posts/45722843/edit) mit dem entsprechenden Beispieldatensatz und Ihrem gewünschten (resultierenden) Datensatz? – MaxU

Antwort

2

Verwenden index=False Parameter:

csv_temp.to_csv ('%s_%s.csv'%(output,d),sep=',', index=False) 
# NOTE:           ^^^^^^^^^^^ 

UPDATE:

df = pd.read_csv('/path/to/source/file.csv') 

df['tcp.stream'] = pd.to_numeric(df['tcp.stream'], errors='coerce').fillna(-1) 

# please set desired path and file name in the next line 
output_path_template = 'd:/temp/tcp.stream.{}.csv' 

df.groupby('tcp.stream') \ 
    .apply(lambda x: x.to_csv(output_path_template.format(x.name), index=False)) 
+0

einige Zeilen haben keinen Wert für 'tcp.stream' Spalte, in Ihrer aktualisierten Lösung werden diese Daten weggelassen. – user3806649

+0

@ user3806649, sollte es jetzt behoben werden ... – MaxU

Verwandte Themen