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

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

Frage Entwicklung Batch & Shell

Mitglied: 52028

52028 (Level 1)

14.08.2007, aktualisiert 19.08.2007, 11197 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 ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Ä in batch Datei (12)

Frage von BergEnte zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...