2016-08-09 16 views
0

Ich suche nach Hilfe, ich habe Multipath-Ausgabe von Centos-Server in einer TXT-Datei, die so aussieht..txt-Datei lesen und selektive Daten nach .csv exportieren

asm (393040300403de) dm-12 HITACHI 
size=35G queue_if_no_path 
    |- 1:0:0:18 sda 65:48 active ready running 
    `- 3:0:0:18 sdbc 70:368 active ready running 
3600300300a4c dm-120 HITACHI 
size=50G queue_if_no_path 
    |- 1:0:0:98 sdc 70:48 active ready running 
    `- 3:0:0:98 sdca 131:368 active ready running 

Es sollte so aussehen, wenn es in eine .csv-Datei exportiert wird.

DISKS_NAME LUN    LUNID DM-NAME SIZE MULTPATH 
asm  393040300403de 03de dm-12 35G sda sdbc 
No_device 3600300300a4c 0a4c dm-120 50G sdc sdca 

Dies ist so weit ich erhielt, aber das liest nur jede Zeile und legt sie in eine andere Spalte jedes Mal, es ist ein Raum

import csv 

readfile = 'multipath.txt' 
writefile = 'data.csv' 
with open(readfile,'r') as a, open(writefile, 'w') as b: 
    o=csv.writer(b) 
    for line in a: 
     o.writerow(line.split()) 
+0

Bitte geben Sie Ihren Code und Ihre Daten in Codeblöcke ein, damit wir sie besser lesen – janbrohl

+0

Ihre Eingabedatei scheint sehr einfach zu schreiben Ihr eigener Parser wäre nicht so einfach wie das Lesen jeder Zeile. Sie könnten etwas wie [regex] (https://docs.python.org/2/library/re.html) verwenden, um Blöcke von jeweils 4 Zeilen zu analysieren oder einfach manuell nach Zeilen zu teilen und nach bekannten Indizes des Textes zu analysieren . –

+0

Kannst du bitte weitere Beschreibungen hinzufügen, wie die csv- und txt-Dateien formatiert sind? Vielen Dank. –

Antwort

0

Unter der Annahme, dass Sie nur haben die beiden Arten von Einträgen findet Wie im obigen Beispiel beschrieben, können Sie jede Zeile als Faktor für die Anzahl der Elemente definieren, die durch line.split() getrennt sind. Zum Beispiel:

disk_name = "" 
... # other parameters you need to keep track of across lines. I'd suggest creating a class for each lun/disk_name. 

for line in a: 
    line_data = line.split() 

    if len(line_data) == 4: 
     # this will match and 'asm (393040300403de) dm-12 HITACHI' 
     disk_name, lun, dm_name, _ = line_data 
     # process these variables accordingly (instantiate a new class member) 
     continue # to read the next line 

    else if len(line_data) == 3: 
     # this will match '3600300300a4c dm-120 HITACHI' 
     lun, dm_name, _ = line_data 
     disk_name = "No_device" 
     # process these variables accordingly 
     continue 

    if len(line_data) == 2: 
     # this will match 'size=35G queue_if_no_path' 
     size, _ = line_data 
     # process the size accordingly, associate with the disk_name from earlier 
     continue 

    if len(line_data) == 7: 
     # this will match '|- 1:0:0:18 sda 65:48 active ready running' etc. 
     _, _, path, _, _, _, _ = line_data 
     # process the path accordingly, associate with the disk_name from earlier 
     continue 

Natürlich eine Regex zu arbeiten, wenn die Linie den Typen von Daten enthält, die Sie brauchen, und nicht nur die richtige Anzahl von Elementen, wird flexibler sein. Aber das sollte dich beginnen.

Durch die Verarbeitung der Zeilen in dieser Reihenfolge erhalten Sie immer eine neue disk_name/lun, und weisen Sie dann die folgenden "Daten" -Zeilen zu dieser Festplatte. Wenn Sie eine neue Festplatte ankreuzen, werden die darauffolgenden Zeilen der neuen Festplatte usw. zugeordnet.

+0

Danke, das könnte funktionieren. Ich muss das versuchen – sharath