Textdatei importieren und mit PQ auf Tabellenblätter aufteilen

MagnaUser

Cadet 1st Year
Registriert
Juli 2021
Beiträge
12
Servus,

Ich habe eine Textdatei (ErrorStack) mit sehr vielen Zeilen, die sich täglich ändern kann.

Die Datei beginnt so. (siehe Upload)

Name: x01A01xAF1
IP-Adresse: 192.168.70.87
Kommentar: PSSu Antriebsschrank 01A01
Leerzeile
Spaltenname, Spaltenname, .... usw. (stehen vor jedem Abschnitt)
Daten, .... usw.

Ein Abschnitt endet immer mit einer
Leerzeile
Striche ---------------------------------------------------------------------------------------------------------
Leerzeile

Nächster Abschnitt

Name: x01B01xAF1
IP-Adresse: 192.168.70.76
Kommentar: PSSu BVT Pult 01B01

Mit Excel die Datei zu importieren ist ja kein Problem mehr.
Dann ist aber die ganze Datei untereinander importiert.
Bei 1000 von Zeilen, das muss nicht sein.

Ich würde gerne diese Dateien, wenn möglich so importieren das jeder Abschnitt ein Tabellenblatt wird.

Der Name vom Tabellenblatt ist der Name über der IP-Adresse.
Die Spaltennamen stehen in der 5 Zeile.
Ab dann die Daten.

Ich vermute, dass das mit Power Query nicht möglich ist.
Braucht man VBA für? Oder?

Kann mir bitte einer dabei helfen?

Grüße MagnaUser
 

Anhänge

jo das Problem kann extrem schnell gelöst werden bspw. mit PHP:

Regex + PHPExcel (aber ich glaube PhpSpreadsheet auf github ist der Nachfolger davon, da PHPExcel halt deprecated ist)


Bei Python geht es auch schnell mit dem Programmieren mit regex + openpyxl :)

Ich hoffe mal, du wolltest nur einen Lösungsweg erfragen aber nicht die Lösung oder? :P
 
Danke für die Antwort.

Glaube ich gerne das du das schnell lösen könntest.
Und wenn du das mit PHP machen würdest dann müsste ich tatsächlich nach einer Lösung fragen.
Ich verstehe ganz bisschen VBA aber kein PHP. Kann Excel überhaupt PHP? Was ist den Regex?
So wie es aussieht dauert es nicht mehr lange dann gibt es wohl kein VBA mehr.

Also ich kann nur den Makrorecorder benutzen.
Als erstes den Import. Den habe ich jetzt.

Code:
Sub Makro1()
'
' Makro1 Makro

    ActiveWorkbook.Queries.Add Name:="ErrorStack", Formula:= _
        "let" & Chr(13) & "" & Chr(10) & "    Quelle = Csv.Document(File.Contents(""C:\Downloads\ErrorStack.txt""),[Delimiter=""    "", Columns=6, Encoding=1252, QuoteStyle=QuoteStyle.None])," & Chr(13) & "" & Chr(10) & "    #""Geänderter Typ"" = Table.TransformColumnTypes(Quelle,{{""Column1"", type text}, {""Column2"", type text}, {""Column3"", type text}, {""Column4"", type text}, {""Column5"", type text}, {""Column6""" & _
        ", type text}})" & Chr(13) & "" & Chr(10) & "in" & Chr(13) & "" & Chr(10) & "    #""Geänderter Typ"""
    ActiveWorkbook.Worksheets.Add
    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
        "OLEDB;Provider=Microsoft.Mashup.OleDb.1;Data Source=$Workbook$;Location=ErrorStack;Extended Properties=""""" _
        , Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdSql
        .CommandText = Array("SELECT * FROM [ErrorStack]")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = "Tabelle_ErrorStack"
        .Refresh BackgroundQuery:=False
    End With
    Application.CommandBars("Queries and Connections").Visible = False
    Columns("F:F").EntireColumn.AutoFit
End Sub

Als nächstes jeden Abschnitt bis zur gestrichelte Linie in ein neues Tabellenblatt.

Usw.

Also vielen Dank nochmal für deine Antwort.

Grüße
 
MagnaUser schrieb:
Und wenn du das mit PHP machen würdest dann müsste ich tatsächlich nach einer Lösung fragen.
wieso ist denn python keine option für dich? Du könntest beide als Cronjob / Aufgabe einfach bspw. jeden Tag 1x ausführen lassen und gut ist...

MagnaUser schrieb:
Kann Excel überhaupt PHP?

neee, PHP muss halt Excel können, nicht umgekehrt. Du musst ja nur einen Weg haben, dass die geforderten Anforderungen im Excel-Format abgespeichert werden, mehr nicht. Excel interessiert das dann im endeffekt nicht wie das Dokument erstellt wurde ;)
MagnaUser schrieb:
Was ist den Regex?

Regex ist ne Abkürzung für Regular Expression, zu Deutsch Reguläre Ausdrücke, damit kann man echt schnell die Daten erfassen bzw. direkt aufsplitten und man direkt ne Lösung, auch wenn Regex nicht die Ideallösung sein sollte, denn es gibt bestimmt bessere Wege die ich dir aufzeigen könnte wenn ich wüsste wie diese ErrorStack Datei bspw. erstellt wird... aber egal erstmal, ich wollte es nur erwähnen, dass es immer idealere Lösungen gibt die sauberer sind sag ich mal :D
MagnaUser schrieb:
So wie es aussieht dauert es nicht mehr lange dann gibt es wohl kein VBA mehr

Doch doch, VBA bleibt immernoch beliebt vorallem wird es noch an Berufsschulen und auch Hochschulen gelehrt, jedoch sollte die automatische Ausführung von Skripts deaktiviert werden, aber bei Windows ist es soweit ich weiß standardmäßig immernoch erstmal an obwohl viele diese Funktion für fiese Dinge missbrauchen.
 
ok ich war mal so frei und hab es mal für dich programmiert... auch wenn ich bis jetzt noch keine Antwort von dir erhielt... :D

Ich hoffe mal du kannst mitm composer & pip umgehen und weißt was sonst zu machen ist? weil das gesamte projektsetup kann ich ja nicht für dich hier bauen :D die benötigten Bibliotheken musst du schon selbst installieren/konfigurieren :D

PHP

PHP:
<?php
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

$workbook = new Spreadsheet();

// Aufbereitung des Dateinamens
$today = new DateTime();
$date_stamp = $today->format("Y-m-d");
$filename = "neue_datei_" . $date_stamp . ".xlsx";

// Erstelle ein neues Tabellenblatt
$sheet = $workbook->getActiveSheet();

// Beispiel-Text mit Daten
$text = file_get_contents('ErrorStack.txt');
$pattern = "/((.*?Name:\s{0,1}(.*?)\s).*?\-{5,})/s";

preg_match_all($pattern, $text, $matches, PREG_SET_ORDER);

foreach ($matches as $match) {
    $sheet_name = $match[3];
    $workbook->createSheet()->setTitle($sheet_name);
    $sheet = $workbook->getSheetByName($sheet_name);

    $rows = explode("\n", $match[1]);
    foreach ($rows as $row) {
        $sheet->appendRow(str_getcsv($row));
    }
}

$workbook->removeSheetByIndex(0);

$writer = new Xlsx($workbook);
$writer->save($filename);
?>


Python:

https://pastebin.com/0SxtpNVe

(Python per Pastebin, weil die Whitespaces nicht korrekt übertragen wurden, kp wieso)

Da ist nur ein ganz kleiner Schönheitsfehler drinne, falls der dir garnicht mal auffällt, dann vergiss einfach das ich das erwähnt habe :p

Aber ansonsten sollte alles so zu 100% funktionieren ;)[/CODE]
 
Zuletzt bearbeitet:
Zurück
Oben