2017-09-20 2 views
-7
str = 'FW201703002082017MF0164EXESTBOPF01163500116000 0001201700258000580000116000.WALTERS BAY BOGAWANTALAWA 1M' 

Above Ausdruck wird die Zeichenfolge aufgeteilt werden muß und separat wie folgt extrahieren:einen regulären Ausdruck benötigt String in Python zu spalten

Borkername = FW 
Sale year = 2017 
Saleno = 0300 
sale_dte = 20.08.2017 # date need to be format 
Factoryno = MF0164 
Catalogu code= EXEST 
Grade =BOPF 
Gross weight =01163.50 #decimal point needed 
Net Weight = 01163.50 #decimal point needed 
Lot_No = 0001 
invoice_year = 2017 
invoice_no = 00258 
price = 000580.00 #decimal point needed 
Netweight = 01160.00 #decimal point needed 
Buyer = 'WALTERS BAY BOGAWANTALAWA' 
Buyer_code = '1M' 

Dies ist eine einzige Zeile ohne Nenner. Also, bitte hilf mir, einen regulären Ausdruck zu schreiben, um jedes Feld in Python zu trennen.

Zum Beispiel:

(\A[A-Z]{2}) 

Das gibt mir die ersten zwei Zeichen. Wie kann ich die nächsten 4 Ziffern als Jahr bekommen?

+0

I habe mehr als 10.000 ähnliche reco rds in der Textdatei. – hiran

+1

Sie beginnen mit der Eingabe auf der Tastatur ... –

+0

So funktioniert SO nicht. Sie sollten etwas selbst ausprobieren, und wenn es nicht funktioniert, können Sie hier um Hilfe bitten. – IanS

Antwort

0

Sie müssen dies in zwei Schritten tun. Verwenden Sie zunächst einen regulären Ausdruck, um die Zeichenfolge in Segmente mit (meist) fester Länge aufzuteilen. Dann reparieren Sie die Felder mit der Liste, die Sie zurückbekommen, manuell in das von Ihnen gewünschte Format. Zum Beispiel:

import re    
import csv 

headings = [ 
    "Borkername", "Sale year", "Saleno", "sale_dte", "Factoryno", "Catalogu code", "Grade", "Gross weight", 
    "Net Weight", "Lot_No", "invoice_year", "invoice_no", "price", "Netweight", "Buyer", "Buyer_code"] 

re_fields = re.compile(r'(.{2})(.{4})(.{3})(.{8})(.{6})(.{5})(.{4})(.{7})(.{7}) (.{4})(.{4})(.{5})(.{8})(.{7}).(.*?) (.{2})$') 

with open('input.txt') as f_input, open('output.csv', 'w', newline='') as f_output: 
    csv_writer = csv.writer(f_output) 
    csv_writer.writerow(headings) 

    for line in f_input: 
     fields = list(re_fields.match(line).groups()) 

     fields[3] = "{}.{}.{}".format(fields[3][:2], fields[3][2:4], fields[3][4:]) 
     fields[7] = float("{}.{}".format(fields[7][:5], fields[7][5:])) 
     fields[8] = float("{}.{}".format(fields[8][:5], fields[8][5:])) 
     fields[12] = float("{}.{}".format(fields[12][:6], fields[12][6:])) 
     fields[13] = float("{}.{}".format(fields[13][:5], fields[13][5:])) 

     csv_writer.writerow(fields) 

Dies würde Ihnen output.csv enthält:

Borkername,Sale year,Saleno,sale_dte,Factoryno,Catalogu code,Grade,Gross weight,Net Weight,Lot_No,invoice_year,invoice_no,price,Netweight,Buyer,Buyer_code 
FW,2017,030,02.08.2017,MF0164,EXEST,BOPF,1163.5,1160.0,0001,2017,00258,580.0,1160.0,WALTERS BAY BOGAWANTALAWA,1M 

Dies kann dann in mit Pandas zu lesen:

import pandas as pd 

data = pd.read_csv('output.csv') 
print data 

Welche gibt:

Borkername Sale year Saleno sale_dte Factoryno Catalogu code Grade Gross weight Net Weight Lot_No \ 
0   FW  2017  30 02.08.2017 MF0164   EXEST BOPF  1163.5  1160.0  1 
    invoice_year invoice_no price Netweight      Buyer Buyer_code 
0   2017   258 580.0  1160.0 WALTERS BAY BOGAWANTALAWA   1M 
+0

Martin zu geben., Ich schätze wirklich Ihre Hilfe zu diesem Problem. Dieser Code funktioniert einwandfrei. Wie ich bereits erwähnt habe, gibt es mehr als 10.000 ähnliche Zeilen in der Textdatei. Meine Absicht ist es, ganze Reihe von Zeilen in Panda-Datenrahmen zu importieren und zu extrahieren, Attribute zu extrahieren, die als separate Tabellenspalten erscheinen müssen. \t import re \t Import Pandas als pd \t data = pd.read_csv (u'PUB05_FW_2017_AUG.txt‘, header = None) (Das gibt mir eine 10000 x 1-Matrix) – hiran

+0

Als Beispiel habe ich versucht, ein roh zu extrahieren aus dem Tisch und extrahieren Features. strow = Daten [0: 1: 1] .apply (str) # Da die re_fields = re.match() need string habe ich versucht, es in eine Zeichenfolge mit zu konvertieren df.iloc [0] .apply (str) gab # re_fields = re.match (r '(. {2}) (. {4}) (. { 3}) (. {8}) (. {6}) (. {5}) (. {4}) (. {7}) (. {7}) (. {4}) (. {4}) (. {5}) (. {8}) (. {7}). (. *?) (. {2}) $ ', strow) Wenn ich versuche, obigen Code auszuführen, erhalte ich Fehler als Ich erwähne unten. Fehler: erwartete Zeichenfolge oder bytes-ähnliches Objekt – hiran

+0

Ich würde vorschlagen, dass Sie zuerst Ihren Quelltext mit der obigen Logik in eine richtige CSV-Datei konvertieren, die dann leichter in Pandas behandelt werden kann. –

Verwandte Themen