Textdatei in Tabelle umwandeln

Liebe Community,

ich habe ein kleines Problem bei welchem ich kurz um eure Hilfe bitten wollte. Ich suche eine Möglichkeit Textdateien in Excel-Tabellen umzuwanndeln.

Ich habe einen ganz bestimmten Ordner in den täglich mehrere hundert Textdateien fließen welche immer nach dem selben Schema aufgebaut sind.

Name:
Autos-Hamburg-2009.09.03 145612.txt
Busse-Berlin-2009.08.30 123421.txt
Flugzeuge-Bad Homburg-2009.04.03 233423.txt

Inhalt:
preis,menge,dauer,anbieter
100.43,1200,34,Mueller
101.54,500,12,Schmidt
99.22,2300,57,Meier

So, beim Namen der Tabelle kann man sehen wie diese Unterteilt sind: Artikel,Bindestrich,Stadt,Bindestrich,Datum,Leerzeichen,Uhrzeit
Diese Angaben wechseln untereinander ständig durch ca. 30 Artikel und 20 Städte.
Nun suche ich eine Möglichkeit diese ganzen Dateien automatisch in Excel Tabellen umzuwandeln. Beim Datei Namen soll sich lediglich die Endung von .txt auf .xlsx ändern. Den Inhalt soll er natürlich in eine schöne Tabelle umwandeln. (Gibt es eigentlich Probleme mit den Komma Zahlen welche statt eines Kommas einen Punkt haben?)

Na ja, sicherlich keine leichte Aufgabe aber ich erwarte auch nur eine kleine Hilfestellung oder eine Antwort darauf ob es überhaupt gaht.

MfG
Mike

Hallo!

Dafür is Excel wie geschaffen. Kopiere erstmal die Daten in ein Excel-Sheet, dann nimm den Punkt Daten - Text in Spalten. Da öffnet sich ein Assistent, der dir genau sagt, was du zu tun hast. Du kannst da auch verschiedene Trennzeichen gleichzeitig definieren (jedenfalls in Excel 2007).

Gruß Alex

Ok, so wäre das aber bei knapp 300 - 400 Dateien etwas zu kompliziert. Ich hatte gehofft, das soetwas per Macro gelöst werden kann.
Trotzdem Danke für die Antwort.

Na ja, sicherlich keine leichte Aufgabe aber ich erwarte auch
nur eine kleine Hilfestellung oder eine Antwort darauf ob es
überhaupt gaht.

Hallo Mike,

ja, das geht.

Und nu? *gg*

Lade mal, bitte keine zip daraus machen, so eine txt-datei und die daraus enstandene xlsx-Datei hoch mit FAQ:2606

Die Daten kannst du ja anonymisieren, sehr wichtig ist dabei daß der Aufbau klar erkennbar bleibt.

Gruß
Reinhard

Hallo,

natürlich ist es möglich das auch per Makro zu lösen. Allerdings müßte man vorher genau definieren, was mit den Textdateien passieren soll.

  • Sind alle Textdateien im gleichen Ordner ?
  • Soll aus jeder Text- eine Exceldatei gemacht werden ?
  • Brauchen sie ein Gesamtblatt ? wenn ja in welcher Form

Als Ablauf wäre möglich, alle Namen der Textdateien ist einem Hilfsblatt aufzulisten und diese Namen dann anschließend jeweils in eine xls-Datei umzuwandeln.

Nur als Beispiel welche Funtionen man benötigt. Dieses ist kein fertiges Makro.

Funktionen: DIR, RANGE, SELECT

Range(„A4:A5“).Select
Selection.TextToColumns Destination:=Range(„A4“),
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False,
Tab:=False, Semicolon:=False, Comma:=True, Space:=False,
Other:=False, FieldInfo:=Array(Array(1, 1), Array(2, 1)),
TrailingMinusNumbers:=True

bin gespannt auf deine Antworten

Achim3008

Ok, so wäre das aber bei knapp 300 - 400 Dateien etwas zu
kompliziert. Ich hatte gehofft, das soetwas per Macro gelöst
werden kann.
Trotzdem Danke für die Antwort.

Hallo Reinhard,

ich war mal so dreißt eine der Dateien bei Rapidshare hoch zu laden. Der Link dafür ist folgender:

http://rapidshare.com/files/276419009/Kador-Bane_Tor…

Ok, mir reicht ja auch erstmal dass es überhaupt geht. Wie das Macro dann genau aussehen muss und welche ich da noch alle brauche um anschliessend alle Tabellen in eine Statistik einzufügen werde ich nach und nach heraus finden.
Wollte halt nur nicht 7 Tage umsonst an irgendwelchen Macros tüfteln die hinterher dann doch nicht funktionieren. Dann hätte ich den Kram einfach mit PHP und MySQL gemacht (welches ich auch hätte erlernen müssen).

Danke schonmal bis dahin, ich werde gerne posten was sich da bisher ergeben hat. Wird aber ne Weile dauern, da ich wie gesagt alle erst erlernen muss.

MfG
Mike

Hallo Zentri,

nimm lieber das nächste Mal Hostarea o.a.
Bei Rapidshare kommt dieses:

Leider sind derzeit keine freien Slots für Free-User verfügbar. Um
den Premium-User weiterhin unseren Service zu bieten, müssen Sie 2
Minuten warten. Danach wird erneut geprüft, ob Sie auf die Datei
zugreifen können. Wenn Sie nicht so lange warten möchten, werden Sie
Premium-Mitglied

Und ich habe null Bock da irgendwo premiummitglied zu werden.

Naja, mal abwarten was in 2 Minuten so geschieht.

Gruß
Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

http://rapidshare.com/files/276419009/Kador-Bane_Tor…

Hallo Zentri,

k.A. was da los ist, nach weit mehr als 2 Minuten habe ich es abgebrochen, tat sich nix, Neuversuch brachte nur das Gleiche.
Sorry, ich komme so an deine Datei nicht ran.

Gruß
Reinhard

Hallo Mike,

hier mal das Grundgerüst der Prozedur für den TXT-Dateiimport, inklusive Aufbereitung des Dateinamens.

Gruß
Franz

Sub TXT\_Dateien\_Importieren()
 'Daten werden zunächst in ein Excelblatt importiert, dann eingelesen
 Dim strArtikel As String, strOrt As String, strDatum As String, strDateiTXT As String
 Dim wbDaten As Workbook
 Dim wksDaten As Worksheet
 Dim wbImport As Workbook, strDatei As String
 Dim wksImport As Worksheet
 Dim ZeileImport As Long
 Dim LetzteZeile As Long
 Dim arrDateiname, strMldg As String
 Dim varVerzeichnis
 On Error GoTo Fehler
 'Verzeichnis mit TXT-DAteien auswählen
 With Application.FileDialog(msoFileDialogFolderPicker)
 .AllowMultiSelect = False
 If .Show False Then
 varVerzeichnis = .SelectedItems(1)
 End If
 End With
 'TXT-Dateien im Verzeichnis suchen
 strDatei = Dir(varVerzeichnis & Application.PathSeparator & "\*.txt")
 If strDatei "" Then
 'Ausgabedatei erstellen
 Set wbImport = Workbooks.Add(Template:=xlWBATWorksheet)
 Set wksImport = wbImport.Worksheets(1)
 With wksImport
 'Spaltentitel
 ZeileImport = 1
 .Cells(ZeileImport, 1) = "Artikel"
 .Cells(ZeileImport, 2) = "Ort"
 .Cells(ZeileImport, 3) = "Datum"
 .Cells(ZeileImport, 4) = "File"
 .Cells(ZeileImport, 5) = "Preis"
 .Cells(ZeileImport, 6) = "Menge"
 .Cells(ZeileImport, 7) = "Dauer"
 .Cells(ZeileImport, 8) = "Anbieter"
 'Spalten formatieren
 .Columns(1).NumberFormat = "@"
 .Columns(2).NumberFormat = "@"
 .Columns(3).NumberFormat = "DD.MM.YYYY"
 .Columns(4).NumberFormat = "@"
 .Columns(5).NumberFormat = "#,##0.00"
 .Columns(6).NumberFormat = "general"
 .Columns(7).NumberFormat = "general"
 .Columns(8).NumberFormat = "@"
 '1. Zeile fixieren
 Range("A2").Select
 ActiveWindow.FreezePanes = True
 End With
 ZeileImport = ZeileImport + 1
 Application.ScreenUpdating = False
 'Daten aus Textdateien importieren
 Do Until strDatei = ""
 Workbooks.OpenText Filename:= \_
 varVerzeichnis & Application.PathSeparator & strDatei, \_
 Origin:=xlWindows, StartRow:=2, DataType:=xlDelimited, \_
 TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, \_
 Tab:=False, Semicolon:=False, Comma:=True, Space:=False, Other:=False, \_
 FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 2)), \_
 DecimalSeparator:=".", ThousandsSeparator:=" ", TrailingMinusNumbers:=True
 'Infos aus Dateinamen holen
 arrDateiname = Split(strDatei, "-")
 strArtikel = arrDateiname(0)
 strOrt = arrDateiname(1)
 strDatum = Replace(Left(arrDateiname(2), 10), ".", "-")
 strDateiTXT = Mid(arrDateiname(2), 12)

 Set wbDaten = ActiveWorkbook
 Set wksDaten = wbDaten.Worksheets(1)
 With wksDaten
 LetzteZeile = .Cells(.Rows.Count, 1).End(xlUp).Row
 '4 Leerspalten einfügen
 .Range(.Columns(1), .Columns(4)).Insert
 'Infos aus Dateiname eintragen
 .Range(.Cells(1, 1), .Cells(LetzteZeile, 1)).Value = strArtikel
 .Range(.Cells(1, 2), .Cells(LetzteZeile, 2)).Value = strOrt
 .Range(.Cells(1, 3), .Cells(LetzteZeile, 3)).Value = CDate(strDatum)
 .Range(.Cells(1, 4), .Cells(LetzteZeile, 4)).Value = strDateiTXT
 'Daten kopieren
 .Range(.Cells(1, 1), .Cells(LetzteZeile, 8)).Copy
 End With
 'Daten in Zieldatei einfügen
 wksImport.Cells(ZeileImport, 1).PasteSpecial Paste:=xlPasteValues
 ZeileImport = ZeileImport + LetzteZeile
 'XT-Datei wieder schliessen
 wbDaten.Close savechanges:=False
 Set wbDaten = Nothing
 Set wksDaten = Nothing
 strDatei = Dir
 Loop
 'Spaltenbreite optimieren
 wksImport.Columns.AutoFit
 Application.ScreenUpdating = True
 Else
 MsgBox "keine TXT-DAteien im Verzeichnis " & varVerzeichnis

 End If

 'Speichern unter Dialog anzeigen
 Application.Dialogs(xlDialogSaveAs).Show Arg1:=strDatei
 Err.Clear
Fehler:
 Application.ScreenUpdating = True
 With Err
 If .Number 0 Then
 Select Case .Number
 Case 99999

 Case Else
 strMldg = "Fehler # " & Str(Err.Number) & " wurde ausgelöst von " \_
 & Err.Source & Chr(13) & Err.Description
 MsgBox strMldg, , "Fehler", Err.HelpFile, Err.HelpContext
 If Not wbDaten Is Nothing Then wbDaten.Close savechanges:=False
 Set wksDaten = Nothing
 Set wbDaten = Nothing
 End Select
 End If
 End With
 Set wbImport = Nothing
 Set wksImport = Nothing
End Sub

Hey Reinhard,

meine Freundin erwartet mich jetzt erstmal auf dem Sofa. Ich werde versuchen die Datei im laufe des Abends nochmal hoch zu laden. Aber schonmal vielen, vielen Dank.

MfG
zentri

1 „Gefällt mir“

So, ich habe die Datei nochmal hochgeladen. Die .xlsx Datei verbietet er bei HOSTAREA leider aber der Aufbau sollte recht eindeutig in der Textdatei zu erkennen sein.
Ebenfalls habe ich mal noch ein par mehr Dateien aus dem gleichen Verzeichniss gezipped (ich weiß, sollte ich nicht aber so kann man sehen wie sie sich ändern).

txt Datei: http://www.hostarea.de/server-09/September-adfd9a510…

zip Datei: http://www.hostarea.de/server-09/September-b54c4c5fd…

Ich hoffe diesmal klappt es besser.

MfG
Zentri

WoW!!!

Mit solch einer Antwort hatte ich garnicht gerechnet. Nachdem ich Ort und Artikel getauscht hatte passte das sogar wunderbar.

2 Dinge gibt es da jedoch die ich noch fragen muss.

  1. Ich weiß nicht in wie fern man diesen Vorgang automatisieren kann. Ist es möglich den Ort der .txt Dateien schon im Macro fest zu legen, damit ich den nicht immer angeben muss?

C:\Documents and Settings\Administrator.JP\My Documents\EVE\logs\Marketlogs

Dort liegen die ganzen Dateien und es wäre praktisch wenn man das schon mit ins Macro einbauen könnte. Genau so wäre es auch praktisch wenn man das Speichern ebenfalls automatisieren könnte um das Ganze zum beispiel als „Marketlogs.xlsx“ Datei im gleichen Ordner ablegen könnte.

  1. Beim importieren der Dateien fragt er mich die ganze Zeit ob ich die Informationen in der Zwischenablage speichern möchte.

Bild: http://img246.imageshack.us/img246/5290/excel.png

Das fragt er mich dann für jede einzelne Textdatei und somit muss ich ca. 300 mal auf „Nein“ klicken. Keine Ahnung ob man das von vornherein umgehen kann aber es wäre sehr praktisch. :smile:

MfG
Zentri

Zwischenablage leeren

  1. Beim importieren der Dateien fragt er mich die ganze Zeit
    ob ich die Informationen in der Zwischenablage speichern
    möchte.
    Das fragt er mich dann für jede einzelne Textdatei und somit
    muss ich ca. 300 mal auf „Nein“ klicken. Keine Ahnung ob man
    das von vornherein umgehen kann aber es wäre sehr praktisch.

Hallo Zentri,

ich habe den Code nur überflogen. Du könntest
Application.DisplayAlerts=False am Prozedurbeginn und
Application.DisplayAlerts=True am Prozedurende und in der Fehlerbehandlung einbauen.

Wenn das nix bringt, folgenden Code irgendwie einbauen, vielleicht vor jeder txt-Einlesung:
Call Zwischenablage_leeren
Die drei API-Aufrufe gehören ganz nach oben ins Modul, unter Option Explicit:

Private Declare Function OpenClipboard Lib "user32" \_
 (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () \_
 As Long
Private Declare Function CloseClipboard Lib "user32" () \_
 As Long

Sub Zwischenablage\_leeren()
 If OpenClipboard(0&amp:wink: 0 Then
 Call EmptyClipboard
 Call CloseClipboard
 End If
End Sub

Gruß
Reinhard

Hallo Zentri,

  1. Ich weiß nicht in wie fern man diesen Vorgang
    automatisieren kann. Ist es möglich den Ort der .txt Dateien
    schon im Macro fest zu legen, damit ich den nicht immer
    angeben muss?

Statt der Variablen varVerzeichnis das Ergebnis eines Auswahldialogs zuzuweisen, kann man ihr auch direkt den konstanten Wert zuweisen.

Genau so wäre es auch
praktisch wenn man das Speichern ebenfalls automatisieren
könnte um das Ganze zum beispiel als „Marketlogs.xlsx“ Datei
im gleichen Ordner ablegen könnte.

Auch das ist kein Problem mit der „SaveAs“-Methode kann man die erzeugte Datei auch direkt mit einem vorgegebenen Namen und Format speichern - ohne Dialoganzeige.

  1. Beim importieren der Dateien fragt er mich die ganze Zeit
    ob ich die Informationen in der Zwischenablage speichern
    möchte.

Das passiert in Excel wenn große Datenmengen kopiert werden und direkt danach die Datenquelle geschlossen wird.
Mit einer kleinen Dummy-Kopier-Anweisung für eine Zelle kann man das umgehen. Evtl. den Vorschlag von Reinhard verwenden und vor und nach der Anweisung zum Schließen der TXT-Datei die DisplayAlert-Anweisungen einfügen.

Gruß
Franz

Hier nochmals der komplette angepasste Code:

Sub TXT\_Dateien\_Importieren()
 'Daten werden zunächst in ein Excelblatt importiert, dann eingelesen
 Dim strArtikel As String, strOrt As String, strDatum As String, \_
 strDateiTXT As String
 Dim wbDaten As Workbook
 Dim wksDaten As Worksheet
 Dim wbImport As Workbook, strDatei As String
 Dim wksImport As Worksheet
 Dim ZeileImport As Long
 Dim LetzteZeile As Long
 Dim arrDateiname, strMldg As String
 Dim varVerzeichnis
 On Error GoTo Fehler
 'Verzeichnis mit TXT-DAteien auswählen
 varVerzeichnis = "C:\Documents and Settings\" \_
 & "Administrator.JP\My Documents\EVE\logs\Marketlogs"
 varVerzeichnis = "C:\Users\Public\" \_
 & "Test\01"
' With Application.FileDialog(msoFileDialogFolderPicker)
' .AllowMultiSelect = False
' If .Show False Then
' varVerzeichnis = .SelectedItems(1)
' End If
' End With
 'TXT-Dateien im Verzeichnis suchen
 strDatei = Dir(varVerzeichnis & Application.PathSeparator & "\*.txt")
 If strDatei "" Then
 'Ausgabedatei erstellen
 Set wbImport = Workbooks.Add(Template:=xlWBATWorksheet)
 Set wksImport = wbImport.Worksheets(1)
 With wksImport
 'Spaltentitel
 ZeileImport = 1
 .Cells(ZeileImport, 1) = "Ort"
 .Cells(ZeileImport, 2) = "Artikel"
 .Cells(ZeileImport, 3) = "Datum"
 .Cells(ZeileImport, 4) = "File"
 .Cells(ZeileImport, 5) = "Preis"
 .Cells(ZeileImport, 6) = "Menge"
 .Cells(ZeileImport, 7) = "Dauer"
 .Cells(ZeileImport, 8) = "Anbieter"
 'Spalten formatieren
 .Columns(1).NumberFormat = "@"
 .Columns(2).NumberFormat = "@"
 .Columns(3).NumberFormat = "DD.MM.YYYY"
 .Columns(4).NumberFormat = "@"
 .Columns(5).NumberFormat = "#,##0.00"
 .Columns(6).NumberFormat = "general"
 .Columns(7).NumberFormat = "general"
 .Columns(8).NumberFormat = "@"
 '1. Zeile fixieren
 Range("A2").Select
 ActiveWindow.FreezePanes = True
 End With
 ZeileImport = ZeileImport + 1
 Application.ScreenUpdating = False
 'Daten aus Textdateien importieren
 Do Until strDatei = ""
 Workbooks.OpenText Filename:= \_
 varVerzeichnis & Application.PathSeparator & strDatei, \_
 Origin:=xlWindows, StartRow:=2, DataType:=xlDelimited, \_
 TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, \_
 Tab:=False, Semicolon:=False, Comma:=True, Space:=False, Other:=False, \_
 FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 2)), \_
 DecimalSeparator:=".", ThousandsSeparator:=" ", TrailingMinusNumbers:=True
 'Infos aus Dateinamen holen
 arrDateiname = Split(strDatei, "-")
 strArtikel = arrDateiname(0)
 strOrt = arrDateiname(1)
 strDatum = Replace(Left(arrDateiname(2), 10), ".", "-")
 strDateiTXT = Mid(arrDateiname(2), 12)

 Set wbDaten = ActiveWorkbook
 Set wksDaten = wbDaten.Worksheets(1)
 With wksDaten
 LetzteZeile = .Cells(.Rows.Count, 1).End(xlUp).Row
 '4 Leerspalten einfügen
 .Range(.Columns(1), .Columns(4)).Insert
 'Infos aus Dateiname eintragen
 .Range(.Cells(1, 1), .Cells(LetzteZeile, 1)).Value = strOrt
 .Range(.Cells(1, 2), .Cells(LetzteZeile, 2)).Value = strArtikel
 .Range(.Cells(1, 3), .Cells(LetzteZeile, 3)).Value = CDate(strDatum)
 .Range(.Cells(1, 4), .Cells(LetzteZeile, 4)).Value = strDateiTXT
 'Daten kopieren
 .Range(.Cells(1, 1), .Cells(LetzteZeile, 8)).Copy
 End With
 'Daten in Zieldatei einfügen
 wksImport.Cells(ZeileImport, 1).PasteSpecial Paste:=xlPasteValues
 ZeileImport = ZeileImport + LetzteZeile
 'Dummy-Koperen, um Meldung für größe Datenmenge zu unterdrücken
 ActiveCell.Copy
 Application.CutCopyMode = False
 'TXT-Datei wieder schliessen
 wbDaten.Close savechanges:=False
 Set wbDaten = Nothing
 Set wksDaten = Nothing
 strDatei = Dir
 Loop
 'Spaltenbreite optimieren
 wksImport.Columns.AutoFit
 Application.ScreenUpdating = True
 Else
 MsgBox "keine TXT-DAteien im Verzeichnis " & varVerzeichnis

 End If

' 'Dateispeichern unter Dialog anzeigen
' Application.Dialogs(xlDialogSaveAs).Show Arg1:=strDatei
' Datei wird im vorgegeben Verzeichnis unter dem Namen gespeichert.
 If Val(Left(Application.Version, 2)) \>= 12 Then
 'im Excel 2007er-Format ohne Makros - xlsx
 'FileFormat = xlOpenXMLWorkbook
 wbImport.SaveAs Filename:=varVerzeichnis & Application.PathSeparator \_
 & "Marketlogs", FileFormat:=51, addtomru:=True
 'im Excel 2007er-binär Format - xlsb
 'FileFormat = xlExcel12
' wbImport.SaveAs Filename:=varVerzeichnis & Application.PathSeparator \_
 & "Marketlogs", FileFormat:=xlExcel12, addtomru:=True
 Else
 'im Excel 97-2003-Format - xls - bei Anwendung mit älteren Excelversionen
 'FileFormat = xlWorkbookNormal
 wbImport.SaveAs Filename:=varVerzeichnis & Application.PathSeparator \_
 & "Marketlogs", FileFormat:=-4143, addtomru:=True
 End If
 Err.Clear
Fehler:
 Application.ScreenUpdating = True
 With Err
 If .Number 0 Then
 Select Case .Number
 Case 1004
 'Speichern unter anderem Namen wurde mit nein oder Abbrechen abgebrochen
 Case Else
 strMldg = "Fehler # " & Str(Err.Number) & " wurde ausgelöst von " \_
 & Err.Source & Chr(13) & Err.Description
 MsgBox strMldg, , "Fehler", Err.HelpFile, Err.HelpContext
 If Not wbDaten Is Nothing Then wbDaten.Close savechanges:=False
 Set wksDaten = Nothing
 Set wbDaten = Nothing
 End Select
 End If
 End With
 Set wbImport = Nothing
 Set wksImport = Nothing
End Sub