Top-Themen

Aktuelle Themen (A bis Z)

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

Batch-Datei um Excel-Datei in Text-Datei zu wandeln

Mitglied: 52028

52028 (Level 1)

14.08.2007, aktualisiert 19.08.2007, 12462 Aufrufe, 8 Kommentare

Hallo zusammen,

nach nun 3-stündiger Suche und vergeblichen Bemühungen trage ich mein Problem mal in die Öffentlichkeit.

Die Problemstellung sieht wie folgt aus. Ich habe eine Excel-Datei mit >30 Spalten und mehreren 1000 Einträgen. (Auch mehrere Tabellenblätter, die interessieren aber nicht!). Ich möchte nun gern die ersten 7 Spalten der Datei in ein pipe-getrenntes Text-File speichern.

Das ganze soll automatisch ablaufen, daher die Idee als Batch-Skript. (Falls es eine elegantere, bzw. weniger aufwändigere Lösung gibt, könnt ihr mir die auch gerne verraten!) ;)

Ich bin bereits darauf gestoßen, dass es schwierig wird das Excel-File direkt zu verarbeiten und habe auch schon den Weg über eine *.CVS-Datei gefunden. Damit wäre der erste Ansatzpunkt ja, das Excel-Sheet automatisch in eine Simikolon-getrennte *.CSV-Datei zu wandeln.

Danach möchte ich dann die CSV-Datei per batch-Verarbeitung in eine Textdatei wandeln. Mein Ansatz hierzu sieht in etwa so aus:

01.
FOR /F "tokens=1-7 delims=;" %%a IN (meineCSV.csv) DO echo %%a >> meineTXT.txt
Das Problem an dieser Stelle ist, dass
  • das Simikolon-Trennzeichen der CSV übernommen wird (Ich brauche eine Pipe)
  • nur die erste Spalte in die Textdatei geschrieben wird

Ich hoffe ich konnte mein Problem erläutern und das ihr mich auf den richtigen Weg bringt!
Mitglied: Biber
14.08.2007 um 21:10 Uhr
Moin MarcoS,

>
[code]
FOR /F "tokens=1-7 delims=;" %%a IN (meineCSV.csv) DO echo %%a >> meineTXT.txt
[/code]

Das Problem an dieser Stelle ist, dass
1. Das Simikolon-Trennzeichen der CSV übernommen wird (Ich brauche eine Pipe)
2. Nur die erste Spalte in die Textdatei geschrieben wird


"Problem" ist ein großes Wort...
In der FOR/F-Anweisung willst Du ja die ersten 7 Spalten "erhalten" (tokens 1-7).
Dann musst Du entsprechend auch die dynamischen Variablen %%a...%%g weiterreichen.
Das Trennzeichen "|" musst Du mit einem Caret ("^") maskieren, da es unter Batch eine Steuerzeichen-Bedeutung hat.

01.
FOR /F "tokens=1-7 delims=;" %%a IN (meineCSV.csv) DO echo %%a^|%%b|%%c^|%%d^|%%e^|%%f^|%%g>>meineTXT.txt
Grüße
Biber
Bitte warten ..
Mitglied: 52028
14.08.2007 um 23:29 Uhr
Super, Vielen Dank für die rasche Antwort. Ich habe jetzt gerade leider keine Möglichkeit das auszuprobieren. Gebe aber Rückmeldung sobald ich das getan habe.

Gibt es auch eine Möglichkeit Excel-Dateien direkt zu verarbeiten, oder ist der Zwischenschritt über eine CVS-Datei zwingend notwendig. Vielleicht gibt es kleine Freeware-Tools die diesen Schritt bewerkstelligen und die man einbinden kann.

Aber wie gesagt, ich habe leider keine Möglichkeit das gerade zu testen, sondern kann mich im Moment nur "schlau"-lesen! ;)

Ich habe bisher auch noch gar keine Erfahrung auf diesem Gebiet, kann mir jemand gute Literatur oder Quellen zeigen die sich mit dem Thema beschäftigen? Vor allem die grundsätzliche Syntax interessiert mich.

Viele Grüße!
Bitte warten ..
Mitglied: Biber
15.08.2007 um 01:12 Uhr
Moin marcos,

klar gibt es mögliche Varianten und Wege der Verfeinerung und Automatisierung.
Wahrscheinlich ist allerdings Dein Sachverhalt doch so off road, dass es auch bei Zuhilfenahme eines Freeware-Utilities eher holprig bleibt.
Ich würde in dem Fall, dass Du (aus welchen Gründen auch immer)
  • die Daten in der Excel-Tabelle erzeugst, hast oder pflegst
  • und regelmäßig dieses Export-Format mit den "|"-Trennzeichen brauchst
---> dann drück die Daten über einen Excel-VBA-Makro raus.
So etwas wird hier im Forum meist in wenigen Stunden entwickelt....

Falls Du vorher dennoch selbst auf die Suche nach Utilities gehen willst - vielleicht gibt es ja einen Standalone XLSToCSV-Converter- dann suche nach "CSV" (Comma Separated Values).
Die Abkürzung CVS ist mittlerweile genauso bekannt unter IT-Entwicklern, bezeichnet aber der Quasi-Standard für ein "Concurrent Versions System", ein (Code-)Versionsverwaltungssystem.

Grüße
Biber
Bitte warten ..
Mitglied: bastla
15.08.2007 um 02:09 Uhr
Hallo marcos und willkommen im Forum!

Um Biber's Versprechung (So etwas wird hier im Forum meist in wenigen Stunden entwickelt ...) zumindest in den Grundzügen einzulösen:
01.
Sub SpaltenExport()
02.

03.
Const TABELLE As String = "Tabelle1"  'Zu exportierende Daten in "Tabelle1" ...
04.
Const ABZEILE As Integer = 2          '... beginnen in Zeile 2 ...
05.
Const ABSPALTE As Integer = 1         '... und Spalte A ...
06.
Const ANZSPALTEN As Integer = 7       '... und umfassen 7 zusammenhängende Spalten.
07.

08.
Const DATEI As String = "D:\Test.csv" 'Zieldatei
09.
Const TRENN As String = "|"           'Trennzeichen
10.

11.
Set oDatei = CreateObject("Scripting.FileSystemObject"). _
12.
    OpenTextFile(DATEI, 2, True) 'Datei immer neu erstellen
13.
    
14.
iZeile = ABZEILE
15.
With Worksheets(TABELLE)
16.
    Do While .Cells(iZeile, ABSPALTE).Value <> ""
17.
        sZeile = .Cells(iZeile, ABSPALTE).Value
18.
        For i = 2 To ANZSPALTEN
19.
            sZeile = sZeile & TRENN & .Cells(iZeile, ABSPALTE + i - 1).Value
20.
        Next
21.
        oDatei.WriteLine sZeile
22.
        iZeile = iZeile + 1
23.
    Loop
24.
End With
25.

26.
oDatei.Close
27.
MsgBox "Datei " & DATEI & " erstellt."
28.
End Sub
Anmerkungen:
Aufgrund des gewünschten Trennzeichens nehme ich an, dass Text in der Zieldatei nicht unter Anführungszeichen zu stehen braucht.
Es werden solange Datenzeilen geschrieben, bis eine Zeile erreicht wird, in der die Zelle in der ersten Datenspalte (ABSPALTE) leer ist.
Zum Testen: Wenn Du auf dem Blattregister ("Tabelle1") per Rechtsklick "Code anzeigen" wählst, kannst Du denn Code in den (jetzt geöffneten) VBA-Editor kopieren und aus dem Tabellenblatt als "Makro" aufrufen.

Grüße
bastla
Bitte warten ..
Mitglied: 52028
15.08.2007 um 11:16 Uhr
Wow, ihr seit wirklich schnell! ;)

Ich bin die nächsten Tage nicht in der Stadt und kann das folglich nicht ausprobieren, werde mich aber zu WE hin auf jeden Fall melden und das ausprobieren!

Vielen Dank auf jeden Fall schonmal!
Bitte warten ..
Mitglied: 52028
18.08.2007 um 14:15 Uhr
So, da bin ich wieder!

Die Erstellung der Text-Datei funktioniert wunderbar. Das Makro funktioniert auch. Allerdings suche ich gerade noch nach der Möglichkeit es mittels batchjob direkt auszuführen. Habe schon versucht es mittels Auto_Open() automatisch starten zu lassen - klappt aber noch nicht. Aber probieren geht über studieren... ;)
Bitte warten ..
Mitglied: 52028
19.08.2007 um 16:30 Uhr
So, ich danke euch nochmal - alles läuft jetzt zu meiner Zufriedenheit.

Nur eine Frage habe ich noch. Ist es theoretisch möglich mit diesem Excel-Makro auch eine andere Datei auszulesen? Ich stell mir das so vor, dass mein Batchjob meine Excel-Datei inklusive Makro aufruft, Excel aber widerum das Makro auf eine ganz andere Datei anwendet, dessen Pfad ich im Makro angeben kann.

Geht sowas theoretisch? Oder sogar praktisch ganz einfach?

Viele Grüße!
Bitte warten ..
Mitglied: bastla
19.08.2007 um 22:09 Uhr
Hallo marcos!

Wenn Du das Ganze über Batch starten willst, sollte die Steuerung von Excel per VBS erfolgen, also etwa in der Art:
01.
'XLS2CSV.vbs
02.
Const TABELLE = "Tabelle1" 'Zu exportierende Daten in "Tabelle1" ...
03.
Const ABZEILE = 2          '... beginnen in Zeile 2 ...
04.
Const ABSPALTE = 1         '... und Spalte A ...
05.
Const ANZSPALTEN = 7       '... und umfassen 7 zusammenhängende Spalten.
06.

07.
Const ZIELPFAD = "D:\Exp\" 'Zielpfad mit abschließendem \ angeben
08.
Const TRENN = "|"          'Trennzeichen
09.

10.
Dim oDatei
11.
Set fso = CreateObject("Scripting.FileSystemObject")
12.
If WScript.Arguments.Count < 1 Then
13.
	WScript.Echo "Angabe der Excel-Datei erforderlich!"
14.
	WScript.Quit(1)
15.
End If
16.

17.
Set oArgs = WScript.Arguments
18.
sXLDat = oArgs(0)
19.
If Not fso.FileExists(sXLDat) Then
20.
	WScript.Echo sXLDat & " nicht gefunden!"
21.
	WScript.Quit(1)
22.
End If
23.

24.
sXLSDatei = fso.GetFile(sXLDat).Path 'Vollständigen Dateinamen mit Pfad ermitteln
25.
If LCase(Right(sXLSDatei, 4)) <> ".xls" Then
26.
	WScript.Echo "Angabe einer Excel-Datei (Typ .xls) erforderlich!"
27.
	WScript.Quit(1)
28.
End If
29.

30.
sXLSPfad = Left(sXLSDatei, InStrRev(sXLSDatei, "\")) 'Pfad mit abschließendem "\"
31.
sXLSName = Mid(sXLSDatei, InStrRev(sXLSDatei, "\") + 1)
32.
sDateiName = Left(sXLSName, Len(sXLSName) - 4) 'ohne ".xls"
33.

34.
DATEI = sXLSPfad & sDateiName & ".csv" 'Zieldatei
35.
Set oDatei = fso.OpenTextFile(DATEI, 2, True) 'Datei immer neu erstellen
36.

37.
On Error Resume Next
38.
Set XL = WScript.CreateObject("Excel.Application")
39.
If Err.Number Then Fehler Err.Number, Err.Description
40.
Set oWB = XL.Workbooks.Open(sXLSDatei)
41.
If Err.Number Then Fehler Err.Number, Err.Description
42.
   
43.
iZeile = ABZEILE
44.
With oWB.Worksheets(TABELLE)
45.
	If Err.Number Then Fehler Err.Number, Err.Description
46.
    Do While .Cells(iZeile, ABSPALTE).Value <> ""
47.
        sZeile = .Cells(iZeile, ABSPALTE).Value
48.
        For i = 2 To ANZSPALTEN
49.
            sZeile = sZeile & TRENN & .Cells(iZeile, ABSPALTE + i - 1).Value
50.
        Next
51.
        oDatei.WriteLine sZeile
52.
		If Err.Number Then Fehler Err.Number, Err.Description
53.
        iZeile = iZeile + 1
54.
		If Zeile > 65536 Then Exit Do
55.
    Loop
56.
End With
57.

58.
oDatei.Close
59.
oWB.Saved = True
60.
XL.Application.Quit
61.
WScript.Echo "OK"
62.

63.
Sub Fehler(Fehlernummer, Fehlertext)
64.
WScript.Echo "Fehler " & Fehlernummer & " (" & Fehlertext & ") aufgetreten!"
65.
oWB.Saved = True
66.
XL.Application.Quit
67.
WScript.Quit(Err.Number)
68.
End Sub
Wenn Du das obige Script zB in "C:\Scripts\XLS2CSV.vbs" speicherst, kannst Du es in einer Batchdatei wie folgt aufrufen:
01.
@echo off & setlocal
02.
for /f "delims=" %%i in ('cscript //nologo "C:\Scripts\XLS2CSV.vbs" "D:\Test\Exceldatei.xls"') do set Erg=%%i
03.
If "%Erg%"=="OK" goto :Weiter
04.
If "%Erg%" neq "" echo %Erg%
05.
::Fehlermeldung lesen lassen ...
06.
pause
07.
goto :eof
08.
:Weiter
09.
echo Hier geht es nach der Konvertierung weiter ...
Das Script erwartet die Übergabe einer Exceldatei, für welche die Existenz und der Typ ".xls" geprüft wird. Bei dabei auftretenden Fehlern (oder bei abgefangenen Scriptfehlern), wird eine Fehlermeldung ausgegeben, ansonsten endet das Script mit der Ausgabe von "OK" (oder einem Abbruch wegen eines Scriptfehlers und Anzeige der VBS-Fehlermeldung). Diese Ausgaben werden dazu verwendet, nur bei erfolgreichem Ablauf der Konvertierung zur Marke ":Weiter" zu springen und anderenfalls nach einer "Pause" (zum Lesen der Fehlermeldung) den Batch zu beenden.

Die Ausgabedatei erhält den selben Namen mit Typ ".csv" und wird in den gleichen Ordner wie die Exceldatei geschrieben.

Als Alternative habe ich eine zweite "DATEI = ..."-Zeile für die Verwendung eines konstanten Zielpfades (aber weiterhin variablen Dateinamens) dargestellt. Eine ev bereits vorhandene Zieldatei wird in beiden Fällen ohne Rückfrage überschrieben.

Die wahrscheinlichsten Fehler, die während der Konvertierung auftreten könnten (zB "Tabelle1" nicht vorhanden), werden in der aktuellen Fassung des Scripts abgefangen, sodass der unschöne Nebeneffekt eines Script-Fehlers (nämlich, dass Excel im Hintergrund weiterhin laufen und die ".xls"-Datei geöffnet halten könnte und daher über den Taskmanager, Register "Prozesse", beendet werden müsste) - eigenlich nicht auftreten sollte. Die Konstanten am Beginn des Programms werden allerdings nicht geprüft, sodass eine falsche Zeilen- oder Spaltennummer den beschriebenen Effekt trotzdem herbeiführen könnte ...

Grüße
bastla

P.S.: Für die adäquate Beschreibung des Errorhandlings in VBS fehlen mir einmal mehr die (jugendfreien) Worte ...
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Mit Einer Batch Datei Text Bearbeiten
gelöst Frage von ronny30021Batch & Shell2 Kommentare

Guten Tag miteinader Ich habe folgendes Problem: Ich würde gerne mit einer Batch-Datei eine Text-Datei durchsuchen, Das gesuchte wort ...

Batch & Shell
BATCH ini Datei Datei auslesen
gelöst Frage von Juergen42Batch & Shell2 Kommentare

Hallo zusammen, ich möchte eine ini Datei auslesen mit folgenden Aufbau INHALT DER INI ID=30 NAME="test1" PFAD="K:\Kontoauszug\Test1\*.pdf" PFAD_S="K:\Kontoauszug\Test1\Sicherung\" ID=28 ...

Windows 7

Mit einer Batch-Datei einzelne Ausschnitte aus einer Text-Datei löschen

gelöst Frage von meisterluehrsWindows 719 Kommentare

guten morgen, ja ich weiss haben schon weiss gott wie viele andere gefragt Aber, bei mir hilft nix :/ ...

Windows 7

Text filtern, mit Hilfe einer Batch Datei ?

Frage von meisterluehrsWindows 713 Kommentare

Hallo, ich bräuchte mal die Hilfe von ein paar "Experten" :D, die sich mit den Batch-Dateien, bzw der CMD ...

Neue Wissensbeiträge
Humor (lol)
Preisvertipper
Information von Dilbert-MD vor 3 StundenHumor (lol)3 Kommentare

Moin! weil heute Freitag ist, zeige ich Euch den Preisvertipper der Woche: vergesst den Acer Predator 21x, der ist ...

Windows Update
Sicherheitsupdate für SQL Server 2014 SP3
Information von sabines vor 1 TagWindows Update2 Kommentare

Für den SQL Server 2014 existiert ein Sicherheitsupdate. Laut KB Artikel wird es als CU3 angezeigt: Server 2014 SP3 ...

Backup

Veeam Agent für MS Windows - neue Version verfügbar (bedingt jedoch offenbar .NET Framework 4.6)

Information von VGem-e vor 2 TagenBackup1 Kommentar

Moin Kollegen, einer unserer Server zeigte grad an, dass für o.g. Software ein Update verfügbar ist. Ob ein evtl. ...

Python

Sie meinen es ja nur gut - Microsoft hilft python-Entwicklern auf unnachahmliche Weise

Information von DerWoWusste vor 3 TagenPython2 Kommentare

Stellt Euch vor, Ihr nutzt python unter Windows 10 und skriptet damit regelmäßig Dinge. Nach dem Update auf Windows ...

Heiß diskutierte Inhalte
Windows Server
Windows Server 2016 einrichten
gelöst Frage von borjiaWindows Server35 Kommentare

Ich würde gerne einen Server einrichten, erstmal nur mit DNS und AD. Habe mich die letzten Wochen durch diverse ...

Netzwerkgrundlagen
Neue Serverumgebung von 0 aufbauen
Frage von JacareNetzwerkgrundlagen19 Kommentare

Hallo zusammen, ich bin noch nicht lange hier und weiß nicht, ob meine Frage daher etwas ungewöhnlich ist. Ich ...

LAN, WAN, Wireless
Fritzbox mit zwei Subnetzen?
gelöst Frage von aif-getLAN, WAN, Wireless15 Kommentare

Hallo, einfache Frage: Gibt es eine möglichkeit die Fritzbox mit zwei Netzen zu koppeln? Der Gast LAN zugang lässt ...

Off Topic
Installationskosten Verkabelung
Frage von Xaero1982Off Topic14 Kommentare

Moin Zusammen, ich bräuchte mal ein paar Meinungen, weil ich mir da gerade echt nicht ganz sicher bin. Ich ...