Textfile nach '^M' durchsuchen und Zeile ausgeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
taake
User
Beiträge: 125
Registriert: Donnerstag 14. Oktober 2010, 08:49

Moin, ich hab hier ein kleines Problem und mir gehen die Ideen aus.

Kann es sein das man irgendwas spezial mässiges machen muss um ein Dokument nach newlines zu durchsuchen.
Jedenfalls mit den Methoden wie find und co finde ich das ganze nicht.

Also die Datei die untersucht werden soll, ist ne CSV Datei für ein externen Dienstleister und die lieben Kollegen neigen dazu copy & paste aus excel und co zu benutzen wodurch dann sehr unschöne Sachen passieren.
Daher will ich jetzt was basteln das die Dateien vor dem versenden diesbezüglich überprüfen.

Mal ein kurzes Beispiel:

Code: Alles auswählen

"";"12345";"";"";"BadCompany 23^M";"Irgendwo im Nirgendwo";"DE";"345315"
Das ist eine Beispielzeile mit dem uminösen Windowszeilenumbruch
Den würde ich gerne suchen und mir die betreffende Zeile ausgeben.
Allerdings wie schon geschrieben kann ich den nicht ohne weiteres finden.

Code: Alles auswählen

#!/usr/bin/python2.7

scan_file = '/tmp/Kustamm.csv'
char_count = '20' # count of ; per line
newline = '^M' # Windows newline char 

print 'check ";" count'
for lines in open(scan_file):
        lines = lines.rstrip('\n')
        count = lines.count (';')
        if str(count) == str(char_count):
                pass
        else:
                print lines

#for lines in open(scan_file):
#        lines = lines.rstrip('\n')
#       if newline in lines.read():

#if  '^M' in open(scan_file).read():
#        print yes
Also mir sind leider meine Ideen ausgegangen wie ich das Problem angehen kann.
Ich möchte wie gesagt die Zeile nur angezeigt bekommen ohne irgendwelche eingriffe an dieser Stelle vorzunehmen, allerdings weiß ich nie wie ich in diesem Fall danach suchen soll.
Hoffe ihr könnt mir weiterhelfen, weil man diese tollen Windoof umbrüche auch in den meisten Textprogrammen nicht sieht
(hab sie auch erst mit vim gefunden)
BlackJack

@taake: Du darfst halt nicht nach '^M' suchen. Das sind zwei Zeichen — ein Accent Circumflex gefolgt von einem grossen M. Die sind in den Daten sicher nicht enthalten, und falls doch bedeuten sie keinen Zeilenumbruch. Das ist bloss die Art wie Vim Zeilenumbrüche anzeigt, weil man die ja sonst nicht als Zeichen sehen kann, sondern nur in ihren Auswirkungen.

Die entsprechenden ASCII-Zeichen, die Dich wohl interessieren sind „carriage return” (CR, Dezimalwert 13) und „newline” (NL, Dezimalwert 10). Die haben in Pythonzeichenketten jeweils eine Escapesequenz. Welche das sind überlasse ich Dir mal als Übungsaufgabe Dich mit der Python-Dokumentation auseinander zu setzen. :-)

Das CR *alleine* ist übrigens kein Windows-Zeilenumbruch!

Statt die Zeilen als Text zu lesen, solltest Du die Daten mit dem `csv`-Modul einlesen und dann die einzelnen Felder untersuchen. Denn sonst kannst Du je nach dem auf welchem Betriebssystem Du das machst, oder welche Daten die Felder tatsächlich enthalten, ziemlich durcheinander kommen. Das CSV-Format ist nämlich nicht so simpel wie man auf den ersten Blick vermuten mag. Es gilt zum Beispiel nicht dass eine Zeile in der Textdatei auch einer Tabellenzeile bzw. einem Datensatz entsprechen muss. Und Trennzeichen dürfen auch innerhalb von Feldern vorkommen.
taake
User
Beiträge: 125
Registriert: Donnerstag 14. Oktober 2010, 08:49

Danke dafür, habs jetzt geschafft mir was zusammen zu prockeln, nicht perfekt, aber es weißt mich jetzt darau hin das ein newline char gefunden wurde wo keiner sein dürfte, nebst zeilenangabe in der datei, damit kann ich zumindest leben.

Allerdings finde ich keine Möglichkeit die columns per row zu kontrolieren, das kann zwar schon der part den ich oben gebastelt hatte, allerdings würde ich es wenn auch gerne gleich mit dem csv modul erledigen.

Kann zwar mit dem csv.reader() die einzelnen rows nach fehlern abklappern, allerdings nicht die columns zählen, oder irre ich mich da?

Jemand ein tipp wie man das bewerkstelligen kann?
BlackJack

@taake: Schau Dir doch mal den Datentyp an, den der `csv.reader()` für eine einzelne Datenzeile liefert. Dann sollte klar sein wie man die Anzahl der Spalten heraus findet.
Antworten