rico55
Goto Top

Per Batchdatei Datei in Datei kopieren

Hallo

ich habe eine Textdatei in der sehr große Zeilen drinstehen ( eine Zeile hat 40 Kilobyte)

Diese Datei, nennen wir sie abc.txt die aktuell 1 Zeile beherbergt,
möchte ich exponentiell vergrößern und die logik in der batchfile ablegen.

Ein Beispiel:

In Datei abc.txt steht

a, b , c


Ich hätte gerne dass das Batchskript die Datei abc.txt einließt und wieder in abc.txt reinschreibt.
Dann habe ich beim ersten Durchlauf 2 zeilen, dann 4 ,dann 8 usw...bis 1 millionen

Kann mir da jemand helfen?

Gruß
Mike

Content-Key: 211234

Url: https://administrator.de/contentid/211234

Printed on: April 19, 2024 at 22:04 o'clock

Member: MrNetman
MrNetman Jul 11, 2013 at 16:22:56 (UTC)
Goto Top
Und wann platzt deine Datei?
Eine Million Zeilen mit jeweils 40.000 Zeichen. (4E4 x 1E6 = 4E10)
das ergibt mindestens 40 Gigabyte

Gruß
Netman
Member: Endoro
Endoro Jul 11, 2013 at 16:25:35 (UTC)
Goto Top
Hallo Mike,

leider kann batch nur mit Zeichenketten bis 8191 Zeichen umgehen.

lg
Member: Xolger
Xolger Jul 11, 2013, updated at Jul 12, 2013 at 12:43:16 (UTC)
Goto Top
Hallo Mike,

nicht schön aber funktioniert:
copy 1.txt 2.txt
copy 1.txt + 2.txt
del 2.txt

Für Schleifen gibs hier ja genug Beispiele und Experten.
Und bestimmt gibt es auch ne elegante Lösung.


Gruß
Xolger
Member: rubberman
rubberman Jul 11, 2013 updated at 21:45:40 (UTC)
Goto Top
Hallo Mike,

Was ist der tiefere Sinn der Aktion?
Wenn es nur darum gehen sollte eine Datei mit einer bestimmten Größe zu erzeugen, dann hilft dir FSUTIL (benötigt aber Adminrechte).
fsutil file createnew "%userprofile%\desktop\abc.txt" 1000
... erzeugt eine Datei mit 1000 Nullzeichen (=1000 Byte Größe) auf deinem Desktop.

Grüße
rubberman
Member: Rico55
Rico55 Jul 12, 2013 at 11:43:14 (UTC)
Goto Top
Hallo,

tieferer Sinn ist wirklich das was ich geschrieben habe...

ich habe eine CSV Datei mit einer Zeile und die hat extrem vielen Spalten (>1000)
Nun möchte ich die Datei nicht irgendwo lagern müssen, weil wie schon richtig bemerkt, sind das 40 GB Platzverschwendung.
Ich möchte das mir ein Skript die Datei on the fly zusammenbaut.

Im SQL würde ich nun einfach ein INSERT INTO table SELECT * from Table machen ... das mache ich 20 mal, dann habe ich 1 Millionen
Datensätze mit 1000 Spalten.
Genau das möchte ich per Batch nun mit der CSV Datei machen - ich möchte eine batchfile mit einer Zeile und 1000 Spalten irgendwo ablegen und nach Bedarf soll er per klick 1000000 Datensätze draus machen (damit unser Azubi das auch kann)

Eine neue Anforderung ist zusätzlich, dass der erste Wert pro Zeile nach oben inkrementieren soll, damit ich eine identifizierende ID habe.

Gruß Mike

PS:
Diejenigen die nun sagen "das geht mit batch nicht" ... mir ist es grundsätzlich egal, wenn das mit VB oder Powershell geht, bin ich ganz ohr.
Member: Endoro
Endoro Jul 12, 2013 updated at 12:40:08 (UTC)
Goto Top
Hallo Mike,

Zitat von @Rico55:
ich möchte eine batchfile mit einer Zeile und 1000 Spalten
irgendwo ablegen und nach Bedarf soll er per klick 1000000 Datensätze draus machen

Meine Batchdateien sind einspaltig und enthalten Programmcode face-smile

Wie sollen aus einer Zeile mit 1000 Spalten 1 Mio Datensätze werden?
Hab ich irgendwas verpasst face-surprise

lg
Member: rubberman
rubberman Jul 12, 2013 at 12:46:13 (UTC)
Goto Top
Hallo Mike.

Quick'n'dirty als VBScript:
Option Explicit

Const sFilePath = "abc.csv"  
Const iDataSets = 1000

Const ForWriting = 2

Dim oFSO, oFile, aFirstLine, sLine, i, iID

Set oFSO = CreateObject("Scripting.FileSystemObject")  
aFirstLine = Split(oFSO.OpenTextFile(sFilePath).ReadLine, ",")  
iID = CInt(Trim(aFirstLine(0)))
sLine = ""  
For i = 1 To UBound(aFirstLine)
  sLine = sLine & "," & aFirstLine(i)  
Next
Set oFile = oFSO.OpenTextFile(sFilePath, ForWriting)
For i = 1 To iDataSets
  oFile.WriteLine CStr(iID) & sLine
  iID = iID + 1
Next
oFile.Close

Die erste Zeile in meiner "abc.csv" sah so aus:
0,a,b,c

Grüße
rubberman
Member: Endoro
Endoro Jul 12, 2013 updated at 14:53:58 (UTC)
Goto Top
Ich hab es mal mit awk getestet:
C:\TEST>awk -F, -v OFS=, "{for (i=1;i<=10^6;i++) print(i,$0)}" file.csv>test.csv

C:\TEST>dir *.csv
12.07.2013  15:40            41.003 file.csv
12.07.2013  16:08    41.009.929.900 test.csv

.. und mit einer Mischung aus sed und batch:
C:\TEST>(for /l %a in (1,1,1000000) do @echo(%a)>numbers.csv

C:\TEST>sed "s#.*#s/.*/\&,&/#" file.csv|sed -f - numbers.csv>test.csv

C:\TEST>dir *.csv
12.07.2013  16:20            41.003 file.csv
12.07.2013  16:20         7.888.896 numbers.csv
12.07.2013  16:48    41.009.888.896 test.csv
awk war 5 Minuten schneller, kaum zu glauben.

lg
Member: Rico55
Rico55 Jul 15, 2013 at 11:38:49 (UTC)
Goto Top
Hallo rubberman,

erst mal vielen Dank für deine Mühe - das funktioniert tadellos.

Ich muss das selbe noch für eine Fixed Length CSV machen.
Kannst Du mir da vielleicht noch mal ein Beispiel dazu geben bitte?

Grüße
Mike
Member: rubberman
rubberman Jul 15, 2013 at 16:22:54 (UTC)
Goto Top
Hallo Mike,

ich denke schon. Aber kannst du mir "Fixed Length" mal erklären? Was hat denn eine gleichbleibende Länge? Sehe von hier aus leider nicht deinen Bildschirm.

Grüße
rubberman
Member: Rico55
Rico55 Jul 23, 2013 updated at 13:19:36 (UTC)
Goto Top
Moin,

sorry ich warleider zwischendurch erkrankt.

Fixed Length bedeutet das die "Spalten" in der CSV Datei, den Wert des größten dargestellt wertes annehmen.
Heisst wenn du 10 Zeilen hast und eine Spalte A stehen möglicherweise in den ersten neun Zeilen nur 2-3 Buchstaben drin
und im zehnten Datensatz steht eine 1000 BYTE große Zeichenkette => dann ist Spalte A immer 1000 BYTE groß.
DIe ersten 9 Zeilen werden mit Leerzeichen aufgefüllt um auf die 1000 Byte zu kommen.
(http://www.webopedia.com/TERM/F/fixed_length.html)
http://wiki.answers.com/Q/What_is_difference_between_fixed_length_recor ..)

Kannst Du mir damit bitte noch helfen?
Irgendwie klappt das bei mir nicht.

Gruß Mike

PS:
ich komme auch schon recht weit

Ich schaffe es aber leider nicht folgende Anforderungen umzusetzen

1) Meine Zeile hat 1000 "Spalten". DIe will ich ungerne von Hand da eingeben.
Die "Spalten" sind nun getrennt durch einen Tab.

2) Ich will nicht alle Spalten auf die selbe fixed length setzen sondern nur z.B. die Spalte
777 auf 100 BYTE.
Member: rubberman
rubberman Jul 24, 2013 at 19:27:37 (UTC)
Goto Top
Hallo Mike,

ich weiß nicht ob dir bewusst ist, dass du Äpfel mit Birnen vergleichst.

Eine Datenbank ist ein binäres Gebilde. Dort kannst du den Speicherplatz für verschiedene Datenfelder vordefinieren. Was dann die Datenbanksoftware tut ist abhängig von der Implementation.
Beispielsweise könnte der Speicherbereich die Daten enthalten, die restlichen Bytes sind ausgenullt (mit HEX 0x00 beschrieben).
Oder ein fixer Datenbereich enthält den Wert, der Rest ist zufälliger Datenmüll. Start und Länge des eigentlichen Wertes sind adressiert.

Du möchtest aber nun mit einer CSV Datei arbeiten. CSV ist aber Plaintext, dort funktioniert das nicht! Das einzige, was du tun kannst ist Leerzeichen voran- oder nachzustellen. Stellt sich mir die Frage, welches Benefit du damit erreichst? Leerzeichen sind Zeichen, die dann zum Wert gehörig interpretiert werden und nicht etwa als "Nichts".

Was also ist das Ziel der Aktion??? Was versprichst du dir davon?

Grüße
rubberman