Importieren und analysieren Sie mehrere text-Dateien in eine einzige XLS?
Ich habe schon googeln dieses den ganzen Tag, aber da habe ich null VBA-Kenntnisse, ich kann nichts finden, das funktioniert einwandfrei und ich kann mich anpassen an meine Bedürfnisse.
Ich habe einen Ordner mit über 4500 text-Dateien mit der Ausgänge einer hardware test auf Computern, die wir verarbeiten. Die text-Datei hat eine Menge von Informationen, die ich nicht brauche. Was ich tun müssen ist, importieren Sie alle diese Dateien in eine einzige Tabelle und dann analysieren Sie bis auf die 3 gewünschten Felder jeder - und in einer solchen Weise, die leicht lesbar sind.
Ich hatte eine harte Zeit, die auch der Suche nach einem VBA-makro, das den import der text-Dateien ohne Fehler, die ich nicht überwinden kann. Ich fand die folgenden, jedoch ist es festgelegt, das sich für eine zweite Spalte in der Datei, die in meinem Fall Schrauben die eingegebenen Daten und wirft um Werte, die alle über dem Platz (denke kleinere Formatierungs-Problem mal 4500 Einträge).
Hier ist das makro:
Sub test()
Dim myDir As String, fn As String, ff As Integer, txt As String
Dim delim As String, n As Long, b(), flg As Boolean, x
myDir = "c:\test" '<- change to actual folder path
delim = vbTab '<- delimiter (assuming Tab delimited)
Redim b(1 To Rows.Count, 1 To 2)
fn = Dir(myDir & "\*.txt")
Do While fn <> ""
ff = FreeFile
Open myDir & "\" & fn For Input As #ff
Do While Not EOF(ff)
Line Input #ff, txt
x = Split(txt, delim)
n = n + 1
If Not flg Then b(n,2) = fn
If UBound(x) > 0 Then
b(n,1) = x(1)
End If
flg = True
Loop
Close #ff
flg = False
fn = Dir()
Loop
ThisWorkbooks.Sheets(1).Range("a1").Resize(n,2).Value = b
End Sub
Und hier ist ein Beispiel von einem text-Dateien:
ILPN Number: I01128204
MAC Address: E0DB55820F85
Hardware:
CPU:Intel(R) Core(TM) i3-2370M CPU @ 2.40GHz
MOTHERBOARD:Dell Inc. - 0G8TPV - A02
BIOS VERSION/DATE:A02 - 08/15/2012
RAM DETECTED:4096 MB (BANK 0: 0/DDR3/1333 - BANK 2: 0/Unknown/0)
MANUFACTURER:Dell Inc.
PRODUCT:Inspiron 3520
SERIAL:B1JW9V1
NIC SPEED/NAME:100 Mbps - Realtek PCIe FE Family Controller, V:8.1
GRAPHIC RES:1366 x 768 (32 bits)
OPTIC DRIVE:HL-DT-ST, DVD+-RW GT80N , A103 (E:)
FIXED DISK:ST500LM012 HN-M500MBB - 465.76 GB (C: - GPT)
- 0.00 GB (D: - MBR)
WINPE:Microsoft Windows 8 Ultimate Edition, 32-bit (build 9200)
Module 126: Result: Ok
Initializing module version='1.0.0.17' with ''
Module Initialization done.
Starting module with: Param1=0x00010010 - Param2=0xFFFF0000
Module start: 14/05/2013 10:38:40
Set language module to: en-US
Found disk: 0 - 'ST500LM012 HN-M500MBB'
All PHYSICALDRIVE will be used as valid target...
Module started properly.
Cleaning element 'Disk ID: 0 - Model: ST500LM012 HN-M500MBB - Size: 465.762 GB' with algorithm 'Basic (random)'...
Clean process Successful
Process took 6099 sec to clean 476940.02MB ~ 78.20 MB/Sec
Closing module with code '1'...
Closing module done with result '0'
Releasing module...
Releasing module done at: 14/05/2013 12:20:19
So, von alles, was, die ich brauche, um zu ziehen aus der "ILPN-Nummer", Die MAC-Adresse, und die Zeile, die sagt "Modul 126: Ergebnis OK". Alles andere kann Weg. Es wäre schön, wenn ich es sortiert mit Spalten für die drei Werte, und dann wird jeder Datensatz in einer eigenen Zeile.
Dies ist wahrscheinlich eine zwei-Schritt-Prozess. Eine oder beide Lösungen wäre enorm hilfreich. Danke!
- Sind Sie auf der Suche nach einem VBScript-Lösung (wie die tags sagen) oder eine VBA-Lösung (wie dein code sagt)? Die beiden Sprachen sind nicht das gleiche.
- Sorry, ich denke, VBA dann? Was würden Sie im VB-editor in Excel.
- Ja, das wäre VBA.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einem VBScript für das Lesen der drei Linien, die von mehreren input-Dateien in eine Excel-Tabelle könnte wie folgt Aussehen:
Als VBA-makro sollte Folgendes funktionieren:
Neuformulierung der Aufgabe/problem:
Gegeben eine Menge von strukturierten text-Dateien in einem Ordner befindet, extrahieren Sie aus jeder Datei drei (oder ein Vielfaches von drei?) Datenelemente (ILPN-Nummer, MAC-Adresse, Testergebnis) und setzen Sie diese als Zeilen in eine .txt/.csv-Datei, die kann rot von/in Excel importiert werden.
Idee:
Schleife über die Dateien, Lesen jedes in den Speicher zu analysieren/extrahieren der Daten-triple(s) mit einem RegExp, schreiben Sie Sie in die output-Datei; Excel verwenden, um die Ausgabe-Datei weitere Bearbeitung manuell.
Plan:
Verwenden Sie eine VBScript-von der Befehlszeile aus, um die Dinge einfach halten.
[Wenn, die gut Aussehen auf Sie und Sie können die Antwort auf die Frage "Hat jedes Eingabe-Datei enthält eine oder mehrere triple info(s)?", Ich bin bereit, fügen Sie einige proof-of-concept-code für dieses Konzept.]
Während Sie warten:
Ihre zusätzliche info, ich glaube, dass @Ansgar ' s Vermutungen über Ihre input-Daten sind meist richtig, und es wurden zwei Tippfehler im code. So geben Sie Ihren Text (+1) ausprobieren, indem man eine "Eingabeaufforderung", anlegen/ändern, um ein geeignetes Verzeichnis, kopieren Sie den code in eine Datei - sagen
ansgar.vbs
- passen Sie die Ordner - /Ausgabe Datei-Angaben zu Ihrem Bedarf, und führen Sie es übercscript ansgar.vbs
.Kleine Veränderungen - wie wenn man das ganze "Modul" - Zeile in der 3. Abschnitt
sind nicht zu hart. Wenn Sie Glück haben, dann ist das problem gelöst.
Update (wrt Kommentar/Tiefgestellt):
Ich denke die
Linie daran Schuld ist. Die Split () - auf ":" sollte aufgeteilt input-Zeilen wie
in ein array mit drei Elementen "Module 126", "Ergebnis" und "Ok" nummeriert/indiziert/tiefgestellte von 0 bis 2. Wenn die Split() nicht zwei : Trennzeichen in der Zeile, die
resultierende array wird kleiner und der Zugriff auf ein element #2 scheitern wird.
Haben Sie zum zuweisen der Rückgabewert von Split() in eine variable, überprüfen Sie die Größe des Arrays (UBound), Blick auf die fehlerhaften Zeilen, und entscheiden, ob Sie zu ignorieren oder zu ändern, die Bewachung If-Bedingung.