viking
Goto Top

Mit batch aus einem Verzeichnis viele txt Dateien mit mehrenen Zeilen in eine txt Datei Zeilenweise inklusive Dateinamen zusammenführen

Hallo,
wieder mal was für bastla oder die anderen Expertenface-wink

Ich habe ein Verzeichnis c:\temp
In diesem habe ich viele Textdateien. *.txt
Jede Textdateien hat mehrere Zeilen jedoch weniger als 100 Zeilen und die Informationen in den Zeilen ist auch nicht größer als maximal 50 Zeichen.
Ziel:
Ich möchte per batch eine Textfile „Ergebnis.txt“ im gleichen Verzeichnis erzeugen, welches alle vorhandenen Textdateien zu einer zusammenfügt,
wobei aber der Inhalt der einzelnen Textdateien, Zeile für Zeile jeweils als eine Zeile in die neue Datei "Ergebnis.txt" geschrieben werden soll.
Ich benötige natürlich einen Trenner.
Der Dateiname der Ursprungsdateien soll jeweils als erste Information in die Zeile geschrieben werden.

Ich möchte die Datei dann in Excel importieren, bzw. einlesen.

Wenn gleich eine Excel Datei erzeugt werden könnte wäre natürlich noch besser.

Die einzelnen Zeilen der Ursprungsdateien sollen dann demzufolge in Spalten sein.
Für die Lösung einer Textdatei würde ich daher einen passenden Trenner benötigen.
Ich verwende Excel 2007 daher würde der Klammeraffe ganz passend sein, Excel 2003 auch kein Problem.

Gruß viking

Content-Key: 156325

Url: https://administrator.de/contentid/156325

Printed on: April 24, 2024 at 07:04 o'clock

Member: Friemler
Friemler Dec 04, 2010 at 02:46:41 (UTC)
Goto Top
Hallo viking,

der folgende Code sollte Dein Problem lösen.
@echo off

setlocal

set "WorkingDir=C:\Temp"  
set "InFiles=%WorkingDir%\*.txt"  
set "OutFile=%WorkingDir%\Ergebnis.txt"  

type NUL > "%OutFile%"  

for %%f in ("%InFiles%") do (  
  >>"%OutFile%" <NUL set /p "=%%f@"  

  for /f "usebackq delims=" %%l in ("%%f") do (  
    >>"%OutFile%" <NUL set /p "=%%l@"  
  )

  >>"%OutFile%" echo.  
)

endlocal
exit /b
Die äußere FOR-Schleife ließt Pfad+Namen aller Dateien mit der Endung .txt im angegebenen Verzeichnis ein. In Zeile 11 wird der Dateiname mit einem nachfolgenden @ als Trennzeichen in die Ausgabedatei geschrieben. Der Befehl <NUL set /p "=xxx" gibt xxx ohne nachfolgenden Zeilenumbruch aus, deshalb werden auch die Dateizeilen, die von der inneren FOR-Schleife eingelesen und in Zeile 14 mit nachfolgendem Trennzeichen @ in die Ausgabedatei geschrieben werden, alle in eine Zeile der Ausgabedatei geschrieben. In Zeile 17 wird der Zeilenumbruch zum Abschluss einer Zeile in die Ausgabedatei geschrieben.

Einschränkung: Leerzeilen werden nicht in die Ausgabedatei übernommen.

Zum Laden der Ausgabedatei in Excel musst Du Dich durch den Import-Dialog für CSV-Dateien klicken (Datei->Öffnen...->Dateityp auf Textdateien (*.prn; *.txt; *.csv)) und als Trennzeichen @ wählen.

Gruß
Friemler
Mitglied: 76109
76109 Dec 04, 2010 at 12:35:50 (UTC)
Goto Top
Hallo viking!

Dann doch gleich direkt in Excel importierenface-wink

Quelltext in ein Modul kopieren, Konstanten anpassen und über <Extra><Makro><Makros> starten:
Const FolderPath = "C:\Temp"  

Const SheetName = "Tabelle1"  

Sub TextImport()
    Dim Fso As Object, File As Object, TextFile As Object, Text As Variant, Line As Long
    
    Set Fso = CreateObject("Scripting.FileSystemObject")  
    
    Sheets(SheetName).Activate:  Cells.ClearContents
    
    Line = 1
    
    For Each File In Fso.GetFolder(FolderPath).Files
        If LCase(Fso.GetExtensionName(File.Name)) = "txt" Then  
            Set TextFile = Fso.OpenTextFile(File.Path)
            
            Text = Split(TextFile.ReadAll, vbCrLf):  TextFile.Close
            
            Cells(Line, 1) = Fso.GetBaseName(File.Name)
            
            Range(Cells(Line, 2), Cells(Line, 2 + UBound(Text))) = Text
            
            Line = Line + 1
        End If
    Next

    Columns.AutoFit    'Spaltenbreite automatisch anpassen?  
End Sub
Wobei Leerzeilen als Leerspalten übernommen werden.

Gruß Dieter
Member: viking
viking Dec 06, 2010 at 10:27:50 (UTC)
Goto Top
Zitat von @Friemler:
Hallo viking,

der folgende Code sollte Dein Problem lösen.
> @echo off
> 
> setlocal
> 
> set "WorkingDir=C:\Temp"  
> set "InFiles=%WorkingDir%\*.txt"  
> set "OutFile=%WorkingDir%\Ergebnis.txt"  
> 
> type NUL > "%OutFile%"  
> 
> for %%f in ("%InFiles%") do (  
>   >>"%OutFile%" <NUL set /p "=%%f@"  
> 
>   for /f "usebackq delims=" %%l in ("%%f") do (  
>     >>"%OutFile%" <NUL set /p "=%%l@"  
>   )
> 
>   >>"%OutFile%" echo.  
> )
> 
> endlocal
> exit /b
> 
Die äußere FOR-Schleife ließt Pfad+Namen aller Dateien mit der Endung .txt im angegebenen Verzeichnis ein. In
Zeile 11 wird der Dateiname mit einem nachfolgenden @ als Trennzeichen in die Ausgabedatei geschrieben. Der Befehl <NULset /p "=xxx" gibt xxx ohne nachfolgenden Zeilenumbruch aus, deshalb werden auch die Dateizeilen, die von der
inneren FOR-Schleife eingelesen und in Zeile 14 mit nachfolgendem Trennzeichen @ in die Ausgabedatei geschrieben werden, alle
in eine Zeile der Ausgabedatei geschrieben. In Zeile 17 wird der Zeilenumbruch zum Abschluss einer Zeile in die Ausgabedatei
geschrieben.

Einschränkung: Leerzeilen werden nicht in die Ausgabedatei übernommen.

Zum Laden der Ausgabedatei in Excel musst Du Dich durch den Import-Dialog für CSV-Dateien klicken
(Datei->Öffnen...->Dateityp auf Textdateien (*.prn; *.txt; *.csv)) und als Trennzeichen @ wählen.

Gruß
Friemler



Funtioniert super, ..

Danke!

Gruß viking
Member: viking
viking Dec 06, 2010 at 10:29:40 (UTC)
Goto Top
Funtioniert super.
(Die Daten gleich in Excel)

Danke!

Gruß viking