Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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

Textdatei per Batch in mehrere aufteilen

Frage Entwicklung Batch & Shell

Mitglied: blacksun

blacksun (Level 1) - Jetzt verbinden

10.09.2008, aktualisiert 11.09.2008, 9885 Aufrufe, 6 Kommentare

Hallo zusammen,

ich habe folgendes Problem.
Ich habe eine Textdatei, die sehr viele Zeilen enthält (>10000 Zeilen).

Eine vorhandene Batch geht her und liest nacheinander eine Zeile aus, macht damit etwas, und schreibt das Ergebnis in eine Ausgabedatei.
So geht die Batch von Zeile zu Zeile, was natürlich entsprechend lange dauert, bis alle Zeilen durch sind.

Nun habe ich mir überlegt, dass man das ganze Parallel laufen lassen könnte.
Sprich ich teile die Quell-Textdatei in mehrere Teile, verteile diese auf mehrere Ordner, und starte in jedem Ordner die jeweilige Batch-Datei, die die Verarbeitung pro Zeile in der jeweiligen Teil-Quell-Datei übernimmt.

Am Ende, wenn alle Batch-Dateien durchgelaufen sind, füge ich die verschiedenen Ausgabe-Dateien der verschiedenen Ordner zusammen.
Das Zusammenfügen mache ich am einfachsten mit dem for-Befehl. Ich lasse in jedem Ordner jeweils die Ausgabedatei zeilenweise lesen und schreibe das ganze dann in eine große Ausgabedatei.

Mein Problem:
Wie teile ich die große Quelldatei in möglichst gleichmäßige Teile auf. Sprich ich habe 10 Ordner, in die jeweils eine Teil-Quelldatei mit ungefähr gleich viel Zeilen soll.

Wie könnte ich sowas am elegantesten machen? Wichtig wäre, dass halt immer genau 10 Teildateien rauskommen.
Sprich wenn nur 10 Zeilen in der großen Quelldatei stehen, dann sollen halt 10 Dateien mit jeweils einer Zeile davon rauskommen, umgekehrt bei 10000 Zeilen eben 1000 Zeilen pro Datei.

Viele Grüße
Martin
Mitglied: 60730
10.09.2008 um 19:30 Uhr
Servus,

ein möglicher Ansatz wäre:

01.
rem arbeitskopie 
02.
copy meinetextdatei.txt meintextdatei.ini 
03.
@echo endeglaende >> meintextdatei.ini 
04.
find /n "endeglaende" meintextdatei.ini
so bekommst du schonmal die komplette Anzahl der Zeilen heraus, ohne vorher "wirklich" die ganze Datei mit einer For Schleife durchzuackern.


...aber wie dann weiter?

Das Zusammenfügen mache ich am einfachsten mit dem for-Befehl.
Ich lasse in jedem Ordner jeweils die Ausgabedatei zeilenweise lesen und schreibe das ganze dann in eine große Ausgabedatei.

Eher weniger, mach lieber ein copy text1.txt + text2.txt komplett_text.txt, dein Ziel ist es doch, "schneller" zu werden.

Gruß
Bitte warten ..
Mitglied: bastla
10.09.2008 um 20:07 Uhr
Hallo blacksun!

Wie schon von TimoBeil richtig festgestellt, muss zum Aufteilen jede Zeile gelesen und geschrieben werden, dazu noch die Abfrage, ob die Grenze für einen Teil bereits erreicht ist - wenn das alles in Batch passiert, wird der ev durch die folgende Parallelverarbeitung zu erzielende Vorteil dadurch vermutlich schon zunichte gemacht.

Als Alternative könnte daher (mal wieder ) VBS herhalten:
01.
Quelle = "D:\Datei.txt" 
02.
Ziel = "D:\Teil" 
03.
Set fso = CreateObject("Scripting.FileSystemObject") 
04.
T = Split(fso.OpenTextFile(Quelle).ReadAll, vbCrLF) 
05.
U = UBound(T) 
06.
S = Int(U / 10) 
07.
For i = 1 To 9 
08.
	W = "" 
09.
	For j = (i - 1) * S To i * S - 1 
10.
		W = W & T(j) & vbCrLF 
11.
	Next 
12.
	fso.CreateTextFile(Ziel & i & ".tmp", True).Write W 
13.
Next 
14.
W = "" 
15.
For j = 9 * S To U 
16.
		W = W & T(j) & vbCrLF 
17.
Next 
18.
fso.CreateTextFile(Ziel & "10.txt", True).Write W
Für 66000 Zeilen zu je etwa 65 Zeichen läuft das Script bei mir etwa 40 Sekunden ...

Grüße
bastla
Bitte warten ..
Mitglied: Biber
10.09.2008 um 20:52 Uhr
Hmmja, bastla,

das ist natürlich eine Lösung für die Aufgabenstellung (und sogar eine kurze und knackige Lösung!), aber....

Hey, lass uns mal zwei Schritte zurücktreten und dann noch mal draufgucken...

  • Jetzt nudeln wir eine Zig-Zehntausende-Zeilen-Datei in sportlichen 40 sec durch und portionieren die in 10 handlichere Häppchen,....
  • damit danach 10 eher drömelige Bätche es zeitlich auf die Reihe bekommen, vor dem Morgengrauen eines dieser Häppchen abzufrühstücken..
  • und sich dann wie die 7 (+3) Zwerge darum balgen, die Ergebnisse wieder in eine Final-Outputdatei zu schreiben....

Ööööhmmm.....

Also nee....

Jetzt würde ich bewerten und abwägen...
  • wenn das Weiterlaufen der bisherigen Lösung das Ziel ist: Dann soll doch der heutige Batch morgens um 02h per Taskplaner gestartet werden und meinetwegen 2 Stunden rumrödeln
  • wenn Performance-Tuning das Ziel ist, dass lass uns die ganze Aufgabe per VBS (oder besserem) abfackeln. Besser im Sinne von: Weniger Interpreter, mehr Kompilertes.

So wie jetzt möchte ich es als "Lösung" eigentlich nicht im Forum stehen haben.

Grüße
Biber
Bitte warten ..
Mitglied: bastla
10.09.2008 um 21:23 Uhr
@Biber
Dann gilt also für obiges Script: "Habe Lösung - suche Problem."

Allerdings muss ich Dir (kostet mich allerdings keine Überwindung ) natürlich Recht geben ...

Grüße
bastla
Bitte warten ..
Mitglied: blacksun
11.09.2008 um 22:59 Uhr
Hallo zusammen,

also das vbs-Skript von bastla funktioniert ganz hervorragend.
Feine Sache.

Vielen Dank.

Viele Grüße
Martin
Bitte warten ..
Mitglied: blacksun
11.09.2008 um 23:01 Uhr
Hallo bastla,

also das vbs-Skript funktioniert ganz hervorragend.
Feine Sache.

Vielen Dank.

Viele Grüße
Martin
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Mehrere PDF-Dateien per Batch zusammenfügen (1)

Frage von Grimmli zum Thema Batch & Shell ...

Batch & Shell
gelöst BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren (9)

Frage von Manuel1234 zum Thema Batch & Shell ...

Batch & Shell
gelöst VBS Script in eine Textdatei ausgeben (VBS mit Batch zusammenführen) (5)

Frage von Luuke257 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Tools
gelöst Aussendienst Datensynchronisierung (12)

Frage von lighningcrow zum Thema Windows Tools ...

Windows Server
Suche passender Treiber (12)

Frage von stolli zum Thema Windows Server ...

Peripheriegeräte
Wlan stört Funkmaus (11)

Frage von Falaffel zum Thema Peripheriegeräte ...

Peripheriegeräte
gelöst USB Festplatte verliert Laufwerksbuchstabe (9)

Frage von cese4321 zum Thema Peripheriegeräte ...