2016-05-03 19 views
0

Ich versuche, die Ausgabe einer SQL-Abfrage in Python zu analysieren (kann nicht Cx_Oracle aufgrund von org Einschränkungen installieren, müssen daher den Subprozess gehen Art und Weise.Python Split (' n') bricht eine Zeile in der Mitte statt nach dem Ende der Zeile

Hier ist meine Ausgabe eines subprocess Befehl

output1 = sqlplus.communicate()[0].split('\n') 

['', '05/02/2016 19:42:40,ABC,O\t\t\t\t ,ACTIVE', '\t 49', '', '05/02/2016 19:42:40,ABC,O\t\t\t ,INACTIVE', '\t 11', ''] 

Damit das Datum Sinn macht, versuche ich alle weißen Leerzeichen und Tabulatoren zu entfernen, aber es gibt eine Spalte, die mir Kopfschmerzen schenkt

Wenn ich versuche, zusätzliche Sachen aus früheren Ausgaben mit unter Kabeljau zu entfernen e, die letzte Spalte wird in die nächste Zeile verschoben, anstatt in derselben Zeile zu bleiben. Ich weiß, dass es wahrscheinlich wegen der führenden \ t (Tab) in der letzten Spalte ist, aber ich kann es nicht entfernen. Ich versuche seit Stunden mit Strip, Lstrip, Rstrip, Regexes, aber ohne Erfolg.

for line in output1: 
    if(line != ''): 
      print ",".join([str(x.strip()) for x in line.split(',')]) 

Unten ist meine letzte Ausgabe, aber mit der letzten Spalte in der nächsten Zeile

05/02/2016 19:53:52,ABC,O,ACTIVE 
49 
05/02/2016 19:53:52,ABC,O,INACTIVE 
11 

etwas Hilfe benötigen, herauszufinden, was ich fehle. Vielen Dank im Voraus für alle Ihre Eingaben :)

--Jim

+1

Ihr 'output1' scheint zu zeigen, dass die" letzte Spalte "tatsächlich * bereits * auf einer neuen Zeile in der' communicate() 'Ausgabe ist. Sehen Sie sich an, wie die zweite Saite unmittelbar nach 'ACTIVE' endet und dann' \ t49'' die dritte Saite ist. Sind Sie sicher, dass die Ausgabe des externen Befehls so aussieht, wie Sie es sich vorstellen? – user2357112

+1

Vielleicht fügt der externe Befehl Zeilenumbrüche ein, um einen eigenen Zeilenumbruch zu erstellen. – user2357112

+0

Ihr Code ignoriert die leeren Zeichenfolgen und entfernt Leerzeichen in Komma-getrennten Werten um die Kommas. Es kombiniert jedoch keine einzelnen Elemente der Liste zu einer einzigen Zeile. – Barmar

Antwort

1

Es sieht aus wie Sie jede Zeile wollen die Saiten sein zwischen den leeren Saiten in Ihrer Liste? Diese leeren Strings werden durch split() auf '/ n/n' erzeugt, also dort wo eine Leerzeile steht. Sie könnten sich auf diese Leerzeilen aufgeteilt:

output1 = '\n05/02/2016 19:42:40,ABC,O\t\t\t\t ,ACTIVE\n\t 49\n\n05/02/2016 19:42:40,ABC,O\t\t\t ,INACTIVE\n\t 11\n' 
output1 = output1.split('\n\n') 

Sie dann eine Reihe von Ersatz verwenden können, spaltet, Streifen, und schließt sich, Splitting auf Kommata und Leerraum außer Räume wieder zusammenzusetzen.

for line in output1: 
    line = line.replace(' ', '(^_^)') 
    line = line.split() 
    line = [word.replace('(^_^)', ' ').strip() for word in line] 
    line = ','.join([word.strip(',') for word in line]) 
    print line 
+0

Ihre Methode hat funktioniert, aber nur ein Fall wurde ausgelassen ... , INACTIVE ',' t 4 ', Was mache ich mit diesem? –

+0

Ich sehe diesen Fall in der von Ihnen bereitgestellten Ausgabe nicht. Können Sie das Format der Ausgabe von sqlplus beschreiben oder Ihren subprocess.Popen- oder subprocess.call-Aufruf einbeziehen? – ipsnicerous

+0

Schließlich habe ich es so gemacht (eine Regex angewendet, um nur die Zeichen auszuwählen, die ich will, und dann auf Komma zu teilen. line = re ("[^ 0-9, a-zA-Z: \ /]", '', '' line '= line.split (', ') Dies lässt definitiv einige Leerzeichen um meine tatsächlichen Daten herum, aber da ich Sachen zurück zu Oracle einfüge, habe ich die multiplen Whitespaces mit Oracle TRIM() entfernt Hilfe! –