Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Textdatei mit festen Spaltenbreiten per Batch nach CSV konvertieren?

Frage Entwicklung Batch & Shell

Mitglied: ipzipzap

ipzipzap (Level 1) - Jetzt verbinden

07.05.2011, aktualisiert 15:39 Uhr, 8062 Aufrufe, 9 Kommentare

Hallo,

ich habe eine Textdatei, die wie folgt aussieht:

01.
... 
02.
05/07/2011 14:46 Admin                    ->#Printed                              A2 - Musterfirma 2                           Mustermann, Sabine                           00-0000-00-0000000000000000 
03.
05/07/2011 14:46 Admin                    ->#Printed                              A1 - Musterfirma Musterfirma Musterfirma MustMustermann, Max                              00-0000-00-0000000000000000 
04.
05/07/2011 14:46 Admin                    ->#Printed                              B1 - Musterfirma 3                           Mustermann, Maria                            00-0000-00-0000000000000000 
05.
...
Nun brauche ich das als CSV, damit ich die Datei direkt in Excel öffnen kann. Da es feste Spaltenbreiten sind, sollte das ja nicht sooo schwer sein, nur wie? ^^
Mit findstr und dem "delims" Parameter bin ich nicht so wirklich weitergekommen, da ich kein Leerzeichen als Trenner verwenden kann.

Das "Admin" und "->#Printed" brauche ich nicht, aber alle anderen Spalten:

01.
Datum;Uhrzeit;Firma;Name;Nummer
Danke im Voraus
Dino


PS:
Die Option, die Datei in Excel zu öffnen und dann per "Text in Spalten" zu formatieren, scheidet aus, weil die Datei mehrmals die Stunde aktualisiert wird und ich das Ganze halt automatisieren möchte. Außerdem kann man sie als CSV direkt auch in anderen Programmen verwenden.
Mitglied: Biber
07.05.2011 um 16:17 Uhr
Moin ipzipzap,

natürlich kannst du jeweils die ganze Zeile mit ihren 200 Zeichen einlesen, jeweils mit der batch-eigenen Substringfunktion in einzelne Felder zerbröseln und diese Mimik solltest du auch über die Forumssuchfunktion ein paarmal finden hier im Forum.

Gibt es denn gar keine andere Möglichkeit für dich, diesen Prozess anders zu gestalten, z.B. den "Datei-Erzeuger" irgendwie zu überreden, in einem für dich brauchbareren Format zu schreiben?

Dieses "Über-sieben-Brücken-musst-du-gehn"- ist doch eher was Tolles für Zahnärzte, aber doch nicht in unserem Job.

Grüße
Biber
Bitte warten ..
Mitglied: ipzipzap
07.05.2011 um 16:20 Uhr
So, ich habe mir jetzt mit Hilfe der Suche hier folgendes gebaut:


01.
FOR /F "delims=" %%i in (input.txt) do set "line=%%i" & call:processline 
02.
Goto :eof 
03.
 
04.
:processline 
05.
 
06.
Set "Line=%line:&=§%"  
07.
 
08.
set     "var=date" & call:trim    %line:~0,10% 
09.
set     "var=time" & Call:Trim    %line:~11,5% 
10.
set  "var=company" & Call:Trim   %line:~82,45% 
11.
set     "var=name" & call:trim  %line:~127,44% 
12.
set       "var=nr" & call:trim  %line:~172,26% 
13.
 
14.
set "lineout1=%date%;%time%;%company%;%name%;%nr% 
15.
Set "lineout2=%lineout1:§=^&%"  
16.
 
17.
Echo %lineout2% >> output.csv 
18.
 
19.
:goto :eof 
20.
 
21.
:trim ---setzt eine Variable %var1% auf Wert (alle Parameter) 
22.
Set "%var%=%*" 
23.
 
24.
goto :eof
Jetzt habe ich aber gemerkt, das einige Namen auch Spitznamen in Anführungszeichen beinhalten, also z.B.

Max "TheBrain" Mustermann

Da bekomme ich natürlich Fehlermeldungen.
Wie kann ich das Anführungszeichen noch maskieren, filtern, etc?

Gruß,
Dino
Bitte warten ..
Mitglied: ipzipzap
07.05.2011 um 16:21 Uhr
Zitat von Biber:
Gibt es denn gar keine andere Möglichkeit für dich, diesen Prozess anders zu gestalten, z.B. den
"Datei-Erzeuger" irgendwie zu überreden, in einem für dich brauchbareren Format zu schreiben?

Der Datei-Erzeuger ist ein externes System, das kann ich nicht so ohne weiteres dazu überreden, mal eben seine Logfile-Struktur zu ändern

cu,
Dino
Bitte warten ..
Mitglied: Lochkartenstanzer
07.05.2011 um 16:23 Uhr
cat "textdatei" | gawk ' { print $1 ";" $2 ";" $3 ";" $4 ";" $5 } ' | tee ausgabedatei.csv

wenn man Leerzeichen nur als Trenner hat.

Ansonsten

cat textdatei | sed -e "s/^\(.\{xxx\}\)/\1;/" | ... | tee ausgabedatei.csv

mit xxx als Zahl für die Spaltenposition, hinter der ein ";" gesetzt werden soll und mehrere passende sed-Befehle hintereinander.


Nachtrag: Und wenn man die überflüssigen Leerzeichen loswerden will beides kombinieren:

cat textdatei | sed -e "s/^\(.\{xxx\}\)/\1;/" | ... | gawk -F ";" ' { print $1 ";" $2 ";" $3 ";" $4 ";" $5 } ' | tee ausgabedatei.csv

sed, gawk und vieles andere findet sich in cygwin ( http://cygwin.com ).
Bitte warten ..
Mitglied: Biber
07.05.2011 um 16:35 Uhr
Moin ipzipzap,

du könntest das "Feld" mit dem [Max "TheBrain" Mustermann] umformatieren in [Max 'TheBrain' Mustermann].
Das ginge schmerzfrei mit einer neuen Zeile 07
Set "Line=%line:"='%"

Ich würde das auch nicht wieder (zurücküb)ersetzen - denn Excel oder OpenOffice/LibreOffice oder sonstige Folgesysteme werden bei Texten mit eingebetteten Anführungszeichen genauso rumzicken.

Grüße
Biber
Bitte warten ..
Mitglied: ipzipzap
07.05.2011 um 17:00 Uhr
Zitat von Biber:
Das ginge schmerzfrei mit einer neuen Zeile 07
> Set "Line=%line:"='%"

Danke, klappt soweit. Jetzt bleibt er wieder hängen, weil in diversen Firmennamen ein Pipe-Zeichen drin ist
Ein

Set "line=%line1:|=-%"

klappt aber nicht. Muß ich das noch maskieren?

Gruß,
Dino


EDIT: Klappt erstmal doch... mein Fehler

Hab aber schon wieder andere Sonderzeichen gefunden... melde mich gleich wieder ^^
Bitte warten ..
Mitglied: bastla
07.05.2011 um 19:02 Uhr
Hallo ipzipzap!

Eine Umsetzung Deines Batch-Ansatzes in VBS (obwohl es sich eigentlich, wenn es ohnehin "Richtung Excel" geht, anbieten würde, gleich VBA zu verwenden und in die entsprechenden Spalten des Tabellenblattes zu schreiben) erspart Dir, Dich um Sonderzeichen kümmern zu müssen:
01.
Ein = "input.txt" 
02.
Aus = "output.csv" 
03.
Delim = ";" 
04.
 
05.
Set fso = CreateObject("Scripting.FileSystemObject") 
06.
T = Split(fso.OpenTextFile(Ein).ReadAll, vbCrLf) 
07.
 
08.
For i = 0 To UBound(T) 
09.
    T(i) = Trim(Mid(T(i),   1, 10)) & Delim & _ 
10.
           Trim(Mid(T(i),  12,  5)) & Delim & _ 
11.
           Trim(Mid(T(i),  83, 45)) & Delim & _ 
12.
           Trim(Mid(T(i), 128, 44)) & Delim & _ 
13.
           Trim(Mid(T(i), 173, 26)) 
14.
Next 
15.
 
16.
fso.CreateTextFile(Aus).Write Join(T, vbCrLf)
[Edit]
Übrigens: Es sollte sich doch sogar per Makro-Aufzeichnung ein direkter Import in Excel automatisieren lassen - Ergebnis (in VBA) etwa:
01.
Sub Import() 
02.
Workbooks.OpenText Filename:="D:\input.txt", Origin:=xlMSDOS, _ 
03.
    StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), Array(10, 9), Array(11, 1), Array(16, 9), Array(82, 1), Array(127, 1), Array(172, 1), Array(199, 9)) 
04.
End Sub
[/Edit]

Grüße
bastla
Bitte warten ..
Mitglied: Biber
08.05.2011 um 00:31 Uhr
Moin bastla,

stimme deinem letzten Schluss "Excel-VBA-Lösung" vollkommen zu, hätte aber noch zwei Pingeligkeiten.

Erstens ist dein Schnipsel zwar vielleicht für Redmonder Makro-Recorder flüssig lesbar oder für Coder, die den ganzen Tag Bits und Bytes durch die Uhrmacherlupe betrachten.
Aber für Gelegenheits-Gebrauchsbätcher wie mich ist es so nicht pfleg- und wartbar.

Zweitens kommt as far as i see für die erste Spalte das falsche Datumsformat raus beim Import - Excel würde "05/07/2011" übersetzen als den 5.Juli 2011.
Gemeint ist aber der 7.Mai.

Also mein Vorschlag: ausgehend von dem etwas tristen Rekorderabgespule
01.
Sub Import() 
02.
Workbooks.OpenText Filename:="D:\input.txt", Origin:=xlMSDOS, _ 
03.
    StartRow:=1, DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 1), Array(10, 9), Array(11, 1), Array(16, 9), Array(82, 1), Array(127, 1), Array(172, 1), Array(199, 9)) 
04.
End Sub
.... würde ich es so in epische Breite auswalzen:

01.
Sub ImportV2() 
02.
Workbooks.OpenText Filename:="D:\input.txt", Origin:=xlMSDOS, _ 
03.
    StartRow:=1, DataType:=xlFixedWidth, _ 
04.
    FieldInfo:=Array( _ 
05.
               Array(0, xlMDYFormat), _   ' Inputdatum kommt als MM/DD/YYYY 
06.
               Array(10, xlSkipColumn), _  
07.
               Array(11, xlGeneralFormat), _ 
08.
               Array(16, xlSkipColumn), _ 
09.
               Array(82, xlGeneralFormat), _ 
10.
               Array(127, xlGeneralFormat), _ 
11.
               Array(172, xlGeneralFormat), _ 
12.
               Array(199, xlSkipColumn) _ 
13.
14.
End Sub
Grüße
Biber
Bitte warten ..
Mitglied: bastla
08.05.2011 um 18:38 Uhr
Hallo Biber!
Zweitens kommt as far as i see für die erste Spalte das falsche Datumsformat raus beim Import
Jetzt, wo Du's sagst ...

Tatsächlich habe ich leider den Makro-Teil nur so en passant (und eher als Hinweis gedacht) rangeflanscht ...

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
gelöst BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren (9)

Frage von Manuel1234 zum Thema Batch & Shell ...

Batch & Shell
gelöst VBS Script in eine Textdatei ausgeben (VBS mit Batch zusammenführen) (5)

Frage von Luuke257 zum Thema Batch & Shell ...

Batch & Shell
gelöst Mittels Batch jede Zeile einer Textdatei prüfen (4)

Frage von Peter32 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch-Skript: Messdaten in Textdatei finden und in eine neue Datei schreiben (5)

Frage von habmalnefrage zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (12)

Frage von Motte990 zum Thema Microsoft Office ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...