Top-Themen

Aktuelle Themen (A bis Z)

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: Eine TXT Datei intelligent auslesen und in kleinere Dateien aufteilen.

Mitglied: Mr.Jones

Mr.Jones (Level 1) - Jetzt verbinden

22.10.2013 um 18:55 Uhr, 3988 Aufrufe, 10 Kommentare

Hallo geschätztes Forum,

auch wenn die Überschrift es so klingen lässt als ob dieses Problem mehr als ausdiskutiert ist, so habe ich nach langer Recherche (auch in anderen Foren) keine Lösung für mein Problem gefunden. Und als letzten Ausweg hoffe ich mit einer direkten Frage was zu finden.

Ich habe einige txt Dateien die je ungefähr 200MB groß sind. Damit ich sie aber weiterverarbeiten kann muss ich sie aufsplitten bzw. intelligent herauslesen. Nein, nicht ganz so stupide wie es zuerst klingt.
Die Struktur der Ur-Dateien sieht so aus:

HeaderZeile
01 Mueller xxxxxxxxx
02 Mueller xxxxxxxxx
.
.
23 Mueller xxxxxxx
01 Koenig xxxxxxx
.
.
31 Koenig xxxx
01 Frank xxxx
.
.
28 Frank xxxxx
FooterZeile
Jetzt darf ich nicht einfach stupide nach einer bestimmten Zeile abschneiden sondern derart, dass:

- Jedes Teil File nicht (viel) mehr als 50MB hat. (d.h. es sollten im Schnitt aus einem 200MB File ca. 4 Teilfiles a 50MB heraus.)

- Jeweils jedes Teil File die Header und -Footer Zeile besitzt
UND!

- NICHT mitten in einem Klienten getrennt wird. d.h. das egal wo getrennt wird, erst nach den Daten des Klienten (zb Koenig) getrennt wird und nicht mitten im Klienten. Damit sind Klienten Daten nicht in zwei Teilfiles separiert.


Da die Datenzeilen der Klienten unterschiedlich lang sind, könnten man mit einer Schleife solange auslesen bis die Datei ca 50MB groß ist, dann noch so lange Zeilen einlesen bis wieder der String kommt mit "01". Dann diese Zeile nicht mehr einlesen sondern dann den Footer anhängen. Dann muss aber genau bei dieser Zeile weitermachen um das nächste Teil File zu befüllen incl. Header und Footer.

Ich komme da echt auf keine Idee wie ich das technisch hinbekommen könnte. Auch weil ich kaum Erfahrung mit Batch Programmierung habe.

Ursprünglich dachte ich da an ein Batch Skript. Aber ein Powershell Skript oder VBS wären zulässig.

Wenn jemand eine gute Idee oder mehr hätte wäre ich wahrhaftig dankbar.

Viele Grüße
Mitglied: SarekHL
22.10.2013 um 20:55 Uhr
Ursprünglich dachte ich da an ein Batch Skript. Aber ein Powershell Skript oder VBS wären zulässig.

Auch ein VB-Programm? Das könnte ich wohl schreiben, wenn jetzt sonst niemand eine bessere Idee hat.
VBS wird wohl ähnlich sein, habe ich mich aber nie direkt mit beschäftigt.
Bitte warten ..
Mitglied: Mr.Jones
22.10.2013 um 21:03 Uhr
Ja, VB wäre ebenso möglich.
Denke auch, dass eine Adaption dann einfacher wäre wenn es nötig sein sollte.
Danke.
Bitte warten ..
Mitglied: SarekHL
22.10.2013 um 21:07 Uhr
Zitat von Mr.Jones:
Ja, VB wäre ebenso möglich.
Denke auch, dass eine Adaption dann einfacher wäre wenn es nötig sein sollte.
Danke.

OK. Sind die Dateien vertraulich, oder kannst Du mir so eine 200MB-Datei zum Testen schicken? Text-Dateien lassen sich ja recht gut packen, da dürften nur zwei bis drei MB übrig bleiben ;)
Bitte warten ..
Mitglied: Endoro
22.10.2013, aktualisiert um 22:54 Uhr
Hi,
es geht auch mit purem Batch.
Würde ich aber nicht empfehlen, es rechnet bestimmt eine Woche
01.
@ECHO OFF &SETLOCAL ENABLEDELAYEDEXPANSION 
02.
set /a mb50=52428800 
03.
set /a fsize=%~z1 
04.
set /a pnum=fsize/mb50 
05.
set /a psize=fsize/pnum 
06.
echo Info: %~1 %fsize% Bytes, %pnum% Parts a ca. %psize% Bytes. 
07.
set /a scnt=psize 
08.
set /a pcnt=1 
09.
<"%~1" set /p "header=" 
10.
for /f "delims=" %%a in ('findstr /o "^" "%~1"') do ( 
11.
	set "liner=%%a" 
12.
	for /f "delims=:" %%b in ("%%~a") do set /a lbyte=%%b 
13.
	set "line=!liner:*:=!" 
14.
	if !lbyte! gtr !scnt! ( 
15.
		for /f %%b in ("!line!") do set /a rline=1%%b-100 2>nul 
16.
		if !rline!==1 ( 
17.
			set /a pcnt+=1 
18.
			if !pcnt!==%pnum% (set /a scnt=2147483647) else set /a scnt+=psize 
19.
			>"%~1.part!pcnt!" echo(%header% 
20.
21.
22.
	>>"%~1.part!pcnt!" echo(!line! 
23.
24.
set /a fnum=pnum-1 
25.
for /l %%a in (1 1 %fnum%) do >>"%~1.part%%a" echo(%line%
Aufrufen mit dem Namen der Textdatei, zB script.bat text.txt.
Der Output erfolgt in Parts: text.txt.part1, text.txt.part2 usw.
Wegen delayed expansion werden im Text evtl. vorhandene Ausrufezeichen nicht korrekt übertragen.
Das könnte bB geändert werden.
lg.
Bitte warten ..
Mitglied: Mr.Jones
23.10.2013 um 15:59 Uhr
Ja, in der Tat läuft das Batch eine ganze Weile ;)
Aber etwas verstehe ich da nicht ganz.
- Was machen die 2048MB in Zeile18?
- Fehlen am ende nicht drei Klammern? ")"
- Die Dateien 2,3... haben zwar einen Header, aber der ist der Footer aus der Ursprünglichen Datei.

Die Sache mit den "!" ist kein Rpoblem. Die kommen eh nicht vor ;)
Bitte warten ..
Mitglied: Endoro
23.10.2013 um 16:23 Uhr
Hi,
- 2^31-1 ist die Grenze dessen, was mit cmd berechnet werden kann. Soll hier sicherstellen, dass die letzte Partdatei vollständig ist.
- Fehlten Klammern, liefe das Script nicht. Die Schreibweise 'echo(' ist besser als das früher gebräuchliche 'echo.'.
- 'Header' jeder Partdatei sollte die erste Zeile der Quelldatei sein, das funktioniert bei mir.
lg.
Bitte warten ..
Mitglied: SarekHL
23.10.2013, aktualisiert um 17:21 Uhr
Zitat von Mr.Jones:
Ja, VB wäre ebenso möglich.

Gut, dann kommt hier der Quellcode für ein VB-Programm. Per eMail hast Du es ja schon bekommen, aber der Sinn eines Forums ist ja, daß auch andere davon profitieren können. Also:

01.
  
02.
Private Sub Form_Load() 
03.
 
04.
Dim Quelldatei As String 'Dateiname der Datenquelle 
05.
Dim Zielgroesse As Long 'Zielgröße der Pakete 
06.
Dim Dateinummer As Long 'Nummer der Datei, auf die sich die aktuelle Dateioperation bezieht 
07.
Dim ErsteZeile As String 'Inhalt der ersten Zeile 
08.
Dim Zeile As String 'Jeweils ausgelesene Zeile 
09.
Dim Groesse(50) As Long 'Schon geschriebene Länge der jeweiligen Zieldatei 
10.
Dim Flag1 As Long 'Zeiger, der anzeigt, daß bei der aktuellen Ausgabedatei die Zielgröße erreicht ist 
11.
Dim Dateien 'Hilfsvariable beim Schlußdurchlauf (Letzte Zeile an alle Ausgabedateien anfügen) 
12.
 
13.
Quelldatei = "d:\Testfile.txt" ' Dateiname der aufzuteilenden Datei 
14.
Zielgroesse = 5 * 1048576 '5 * 1048576 Bytes = 5 MB 
15.
 
16.
Open Quelldatei For Input As 1 
17.
Line Input #1, ErsteZeile 
18.
 
19.
Dateinummer = 1 
20.
Flag1 = 1 
21.
 
22.
 
23.
Do While Not EOF(1) 
24.
Line Input #1, Zeile 
25.
 
26.
If Left(Zeile, 8) = "99999999" Then 
27.
   ' Dies ist die letzte Zeile, sie wird an alle Ausgabedateien angehängt und alle Dateien werden geschlossen 
28.
   ' Anschließend wird die Routine verlassen, ohne dass die anderen Schritte noch bearbeitet werden 
29.
   For Dateien = 2 To Dateinummer 
30.
   Print #Dateien, Zeile 
31.
   Close Dateien 
32.
   Next 
33.
   Close 1 
34.
   Exit Do 
35.
   End If 
36.
    
37.
If Left(Zeile, 2) = "01" And Flag1 = 1 Then 
38.
   ' Ein neuer Client beginnt UND das Flag, daß bei der Ausgabedatei die Zielgröße überschritten ist, ist gesetzt 
39.
   ' Es wird eine neue Ausgabedatei geöffnet und die erste Zeile wird dort hineingeschrieben 
40.
   ' Danach geht es weiter im normalen Ablauf 
41.
   Flag1 = 0 
42.
   Dateinummer = Dateinummer + 1 
43.
   Open Left(Quelldatei, Len(Quelldatei) - 4) & "_teil" & Str(Dateinummer - 1) & ".txt" For Output As Dateinummer 
44.
   Print #Dateinummer, ErsteZeile 
45.
   Groesse(Dateinummer) = Groesse(Dateinummer) + Len(ErsteZeile) 'Hier wird protokolliert, wie groß die aktuelle Ausgabedatei schon ist 
46.
   End If 
47.
 
48.
' Die aktuelle Zeile aus der Quelldatei wird in die aktuelle Ausgabedatei geschrieben: 
49.
Print #Dateinummer, Zeile 
50.
'Hier wird protokolliert, wie groß die aktuelle Ausgabedatei schon ist: 
51.
Groesse(Dateinummer) = Groesse(Dateinummer) + Len(Zeile) 
52.
' Wenn die Größe die Zielgröße überschritten hat, wird ein Flag gesetzt, daß beim nächsten Clienten eine neue Ausgabedatei begonnen wird: 
53.
If Groesse(Dateinummer) > Zielgroesse Then Flag1 = 1 
54.
    
55.
Loop 
56.
 
57.
MsgBox "Auftrag abgeschlossen" 
58.
 
59.
End Sub

Und hier noch mal für alle die Anmerkungen aus meiner eMail: Das Programm ist erst mal ganz einfach gestrickt und enthält keine Fehlerabfangroutinen oder so. Das heißt, das Programm ist darauf ausgelegt, daß maximal 49 Teildateien entstehen. Werden es mehr, stürzt das Programm ab. Das Programm enthält auch keinen Dateiauswahldialog, sondern der Dateiname der Quelldatei samt Pfad wird in Zeile 12 fest eingetragen. Natürlich geht das besser, man könnte z.B. ein Verzeichnis angeben und alle darin enthaltenen Dateien automatisch abarbeiten. Aber dazu kenne ich Deine Strukturen zu wenig, so daß ich mich jetzt erst mal auf den Kern, also das Aufsplitten beschränkt habe.
Bitte warten ..
Mitglied: Mr.Jones
31.10.2013 um 11:04 Uhr
Hallo, erstmal vielen Dank euch beiden für eure Bemühungen.

Das Batch skript funktioniert in der Tat ordendlich, doch es läuft wirklich fast 30 Stunden ;)

Das VB-Programm ist einfach perfekt. Es läuft genau so wie wie es soll. Hätte nicht gedacht, dass das so sauber geht. Das Program braucht keine Minute zum Durchlauf!
Also SarekHL, sehr vielen Dank dafür.

Viele Grüße,
Jones
Bitte warten ..
Mitglied: SarekHL
31.10.2013 um 13:08 Uhr
Das Batch skript funktioniert in der Tat ordendlich, doch es läuft wirklich fast 30 Stunden ;)

30 Stunden Warum braucht ein Batch für die gleiche Aufgabe so viel länger?
Bastla, liest Du mit? Das würde mich jetzt mal interessieren ...
Bitte warten ..
Mitglied: Mr.Jones
31.10.2013 um 13:29 Uhr
Ich vermute, dass es am Code liegt. Weniger an der Tatsache das es ein Batch file ist.
Bitte warten ..
Ähnliche Inhalte
Batch & Shell

Batch zum Auslesen einer .txt Datei in Variablen

Frage von DanielG80Batch & Shell2 Kommentare

Hallo, habe das Forum durchforstet und leider nichts passendes gefunden! Ich habe eine Txt datei vorliegen mit folgendem Inhalt: ...

Entwicklung

Batch oder Powershell für .txt-Datei

gelöst Frage von freshman2017Entwicklung5 Kommentare

Hallo liebe Gemeinde, ich habe eine .txt-Datei, die aus einer Artikelnummer und einem Bildname bestehen soll. Ausgangsdatei (export.txt) ist ...

Batch & Shell

BATCH ini Datei Datei auslesen

gelöst Frage von Juergen42Batch & Shell2 Kommentare

Hallo zusammen, ich möchte eine ini Datei auslesen mit folgenden Aufbau INHALT DER INI ID=30 NAME="test1" PFAD="K:\Kontoauszug\Test1\*.pdf" PFAD_S="K:\Kontoauszug\Test1\Sicherung\" ID=28 ...

Batch & Shell

Zeile 12 aus einer TXT-Datei auslesen und als Datei-Name für die TXT-Datei verwenden (für sämtliche TXT-Dateien in einem Verzeichnis!)

gelöst Frage von MrBratwurstBatch & Shell15 Kommentare

Hallo liebe Batch-Pros, als Newbie stehe ich gerade vor der Aufgabe, dass ich in einem Verzeichnis mit Txt-Files (bzw. ...

Neue Wissensbeiträge
Router & Routing

Endlich: Reines Kabel-TV Modem in D erhältlich !

Information von aqui vor 2 TagenRouter & Routing9 Kommentare

Mit dem Technicolor TC4400-EU Modem sind nun auch Breitband Router ohne integriertes Modem oder Firewalls wie z.B. die pfSense ...

Netzwerkgrundlagen
The Illustrated TLS Connection
Information von Lochkartenstanzer vor 3 TagenNetzwerkgrundlagen

Moin, Unter findet man eine gelungene Erläuterung von TLS. Fördert sehr das verständnis darüber, was da passiert. lks

Windows 10

Zuverlässiger Remove-AppxProvisionedPackage Ausführen in W10-1803

Tipp von NetzwerkDude vor 4 TagenWindows 104 Kommentare

Moin, Remove-AppxProvisionedPackage hat in 1709 recht zuverlässig funktioniert, in 1803 ist es leider so das es gerne mail failed ...

LAN, WAN, Wireless
Erfahrung mit dem tplink eap115-wall
Erfahrungsbericht von fisi-pjm vor 5 TagenLAN, WAN, Wireless

Die Hintergründe Als ausgebildeter Fisi und ambitionierter "Hobby ITler" bin ich Netzwerktechnisch immer auf der Suche nach "schönen" Lösungen ...

Heiß diskutierte Inhalte
Netzwerkprotokolle
OpenVPN auf dem Client Verständnisfrage
gelöst Frage von bk900042Netzwerkprotokolle23 Kommentare

Hallo Community, möchte OpenVPN benutzen, um mich über VPN per RDP zu einem Server zu verbinden und auch GIT ...

Windows Server
AD User wird immer wieder gesperrt
Frage von YellowcakeWindows Server14 Kommentare

Hey ich habe einen User (ein GL User - Natürlich was denn sonst) der immer wieder gesperrt wird. Ich ...

Netzwerkmanagement
Netzwerklaufwerk verbinden nicht möglich
gelöst Frage von SteiniMNetzwerkmanagement13 Kommentare

Hallo Leute, ich bin neu hier und brauche eure Hilfe. Danke schon mal im Voraus. Ich habe folgendes Problem: ...

Switche und Hubs
OpenSource oder Freeware zur Verwaltung von Switchen
gelöst Frage von JonskezSwitche und Hubs12 Kommentare

Hallo, gibt eine kostenlose Verwaltungssoftware für Switche (überwiegend HP/Aruba)? Es sollte möglich sein, aus der Ferne z.B. die Firmware ...