Windows-batch-Skript zu Parsen von CSV-Datei und Ausgabe einer text-Datei
Ich habe gesehen, eine Antwort auf einer anderen Seite (Hilfe bei schreiben einer batch-Skript zu Parsen von CSV-Datei und Ausgabe einer text-Datei) - brilliant-code BTW:
@ECHO OFF
IF "%~1"=="" GOTO :EOF
SET "filename=%~1"
SET fcount=0
SET linenum=0
FOR /F "usebackq tokens=1-10 delims=," %%a IN ("%filename%") DO ^
CALL :process "%%a" "%%b" "%%c" "%%d" "%%e" "%%f" "%%g" "%%h" "%%i" "%%j"
GOTO :EOF
:trim
SET "tmp=%~1"
:trimlead
IF NOT "%tmp:~0,1%"==" " GOTO :EOF
SET "tmp=%tmp:~1%"
GOTO trimlead
:process
SET /A linenum+=1
IF "%linenum%"=="1" GOTO picknames
SET ind=0
:display
IF "%fcount%"=="%ind%" (ECHO.&GOTO :EOF)
SET /A ind+=1
CALL :trim %1
SETLOCAL ENABLEDELAYEDEXPANSION
ECHO !f%ind%!!tmp!
ENDLOCAL
SHIFT
GOTO display
:picknames
IF %1=="" GOTO :EOF
CALL :trim %1
SET /a fcount+=1
SET "f%fcount%=%tmp%"
SHIFT
GOTO picknames
Es funktioniert hervorragend ein Beispiel für eine csv-Datei, die ich in dem format:
Header,Name,Place
one,two,three
four,five,six
Aber die eigentliche Datei, die ich ändern wollen, besteht aus 64 Feldern, also veränderte ich die tokens=1-10
zu tokens=1-64
und erhöht die %%a
etc bis zu 64 Variablen (die Letzte wird genannt %%BL
zum Beispiel). Jetzt, jedoch, wenn ich den Stapel auf meinem "großen" csv-Datei (mit der 64-Token) passiert nichts. Keine Fehler (gut) aber keine Ausgabe! (schlecht). Wenn jemand helfen kann, wäre das fantastisch... bin soooo kurz davor den ganzen app arbeiten, wenn ich einfach Nagel-das Letzte Stück! Oder wenn jemand einige Beispiel-code, der tun wird, ähnlich wie die für eine unbestimmte Anzahl von Token... Letztendlich möchte ich ein string sein wird, so wie:
field7,field12,field15,field18
ja, ich möchte auch, aber leider ist es gotta run auf 12 Jahre alten pc mit embedded Windows, und haben eine kleine Stellfläche 🙁
Autsch. Das ist einfach nicht richtig.
🙂 yeah! Konnte nicht überzeugen, Sie zu aktualisieren, wenn! Ich bin überrascht, Sie können sogar als Kassen, geschweige denn, was ich Tue 🙂
Warten Sie eine minute, ist nicht die VB6-runtime nur 1 dll? Mit, dass, vbscript und VB6 code funktionieren würde, und haben eine relativ kleine Stellfläche.
InformationsquelleAutor Jeff Webb | 2011-12-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wichtiges update - ich glaube nicht, dass Windows-batch ist eine gute option für Ihre Bedürfnisse, weil eine einzige FOR /F nicht analysieren kann mehr als 31 Token. Siehe unten den Nachtrag unten für eine Erklärung.
Es ist jedoch möglich, das zu tun, was Sie wollen mit batch. Dieser hässliche code erhalten Sie Zugang zu allen 64-Token.
Anhang bietet wichtige Informationen, wie die oben genannten arbeiten.
Wenn Sie nur brauchen ein paar der Token verteilen sich unter anderem der 64 auf der Linie, dann die Lösung ist geringfügig einfacher, dass Sie vielleicht in der Lage zu vermeiden, mit verrückten Charakteren, wie FÜR Variablen. Aber es ist trotzdem eine sorgfältige Buchführung zu erfolgen.
Beispielsweise im folgenden erhalten Sie Zugang zu Token 5, 27, 46 und 64
April 2016 Update - Basierend auf Untersuchungen von DosTips Benutzer Aacini, penpen, und aGerman habe, entwickelte ich eine relativ einfache Methode, um gleichzeitigen Zugriff auf Tausende von Token verwenden FÜR /F. Die Arbeit ist Teil des diese DosTips thread. Der eigentliche code kann gefunden werden in diesen 3 posts:
Ursprüngliche Antwort
FÜR die Variablen sind begrenzt auf ein einzelnes Zeichen, so Ihr %%BL-Strategie nicht funktionieren kann. Die Variablen sind case-Sensitiv. Laut Microsoft, Sie sind beschränkt auf die Erfassung 26 Token innerhalb einer FOR-Anweisung, aber es ist möglich, mehr zu bekommen, wenn Sie mehr als nur alpha. Seine Schmerzen, denn Sie müssen eine ASCII-Tabelle, um herauszufinden, welche Zeichen gehen, wo. FÜR lässt nicht nur jedes Zeichen, jedoch, und die maximale Anzahl der Token, die ein einzelner FÜR /F zuweisen können, ist 31 +1. Jeder Versuch, zu analysieren und zuordnen von mehr als 31 wird ruhig ausfallen, als Sie entdeckt habe.
Zum Glück, ich glaube nicht, dass Sie brauchen, dass viele Token. Sie geben einfach an, welche Token Sie wollen mit dem TOKEN-option.
geben Sie Ihren 7., 12., 15 und 18 Token.
Nachtrag
April 2016 Update vor Ein paar Wochen erfuhr ich, dass die folgenden Regeln (geschrieben vor 6 Jahren) sind code-Seite abhängig. Die Daten unten wurden überprüft, für Codepages 437 und 850. Mehr wichtiger ist, die FÜR die variable Sequenz von erweiterten ASCII-Zeichen 128-254 nicht mit der byte-code-Wert und variiert enorm von der code-Seite. Es stellt sich heraus, die FOR /F-variable-mapping basiert auf der zugrunde liegenden UTF-(16?) code zeigen. Also die erweiterte ASCII-Zeichen sind von begrenztem nutzen, wenn Sie Sie mit FÜR /F. Siehe den thread unter http://www.dostips.com/forum/viewtopic.php?f=3&t=7703 für weitere Informationen.
Ich einige tests durchgeführt und kann Folgendes berichten (Aktualisierung in Reaktion auf jeb ' s Kommentar):
Meisten Zeichen können verwendet werden wie eine variable, einschließlich der erweiterten ASCII-128-254. Aber einige Zeichen können nicht verwendet werden, um eine variable definieren, in der der erste Teil einer FOR-Anweisung, kann aber verwendet werden, in der DO-Klausel. Ein paar kann nicht verwendet werden, für die entweder. Einige haben keine Einschränkungen, erfordern aber eine spezielle syntax.
Folgende ist eine Zusammenfassung von Zeichen, die Beschränkungen oder erfordern eine Besondere syntax. Beachten Sie, dass text innerhalb der Spitzen Klammern wie
<space>
repräsentiert ein einzelnes Zeichen.Sonderzeichen wie
^
<
>
|
&
muss entweder escaped oder quotiert. Zum Beispiel, die folgenden Werke:Einige Zeichen können nicht verwendet werden, definieren Sie eine variable. Zum Beispiel, die folgende gibt einen syntax-Fehler:
Aber
%%=
wird implizit definiert, indem die TOKEN-option, und den Wert zugegriffen und in der DO-Klausel, etwa so:Den
%
ist seltsam - Sie definieren eine variable mit%%%%
. Aber Der Wert kann nicht zugegriffen werden, es sei denn, Sie verwenden die~
modifier. Dies bedeutet, dass die umschließenden Anführungszeichen können nicht beibehalten werden.Den oben genannten Erträge
%% A
Den
~
ist ein potenziell gefährlicher FÜR die variable. Wenn Sie, versuchen Zugriff auf die variable mit%%~
am Ende einer Zeile, können Sie bekommen zu unvorhersehbaren Ergebnissen und möglicherweise sogar Abstürzen CMD.EXE! Der einzige zuverlässige Weg, um Zugriff ohne Einschränkungen ist die Verwendung%%~~
, die natürlich entfernt alle umschließenden Anführungszeichen.Den
<SUB>
(0x1A) Charakter ist etwas besonderes, weil<SUB>
Literale eingebettet innerhalb des batch-Skripts ausgelesen werden, werden Zeilenvorschubzeichen (<LF>
). Um<SUB>
als FÜR die variable, der Wert muss irgendwie gespeichert innerhalb einer environment-variable ist, und dann%%%VAR%
funktioniert für beide-definition und Zugang.Wie gesagt, eine einzige FÜR /F Parsen und zuordnen maximal 31 tokens. Zum Beispiel:
Den oben genannten Erträge
A=1 _=31
Hinweis - Token 2-30 gut funktionieren, ich wollte nur ein kleines BeispielJeden Versuch, zu analysieren und weisen Sie mehr als 31 Zeichen im hintergrund fehl, ohne ERRORLEVEL.
Können Sie analysieren und die Zuweisung von bis zu 31 Token zuweisen und den Rest für ein anderes token wie folgt:
Den oben genannten Erträge
@=1 ^=31 _=32 33 34 35
Und jetzt die wirklich schlechte Nachricht. Eine einzelne FOR /F kann nie analysieren mehr als 31 Token, wie ich erfuhr, als ich sah Anzahl der Token-limit in einem FOR-Befehl in einem Windows-batch-Skript
Den sehr unglücklichen Ausgang ist
A=1 B=31 C=%C
Eigentlich die meisten Zeichen sind gültige Variablen. Siehe mein Nachtrag oben.
Hmm, vielleicht gibt es Probleme zu verwenden
<tab>,;=
FÜR variable, aber man kann auf Sie zugreifen. Ich kann nur nicht zugreifen%%<0x00>
und%%<0x0D>
Wow, das ist verwirrend. Ich kann nicht angeben, jeder der <tab>,;= als meine Wurzel FÜR Variablen, aber ich kann auf Sie zugreifen, in der DO-Klausel. Ich muss herausfinden, wie aktualisiere ich meine Antwort in einer kohärenten Art und Weise. Danke.
Ich kann immer noch nicht auf %%%% oder %%<0x255>
InformationsquelleAutor dbenham
Meine Antwort besteht aus zwei teilen. Die erste ist eine neue Antwort, die ich gepostet in der Hilfe-in-writing-a-batch-Skript zu Parsen-csv-Datei-und-Ausgang-ein-text-Datei in Frage, die haben keine Beschränkung in der Anzahl der Felder.
Der zweite Teil ist eine änderung, die Antwort, dass können Sie wählen, welche Felder werden extrahiert aus der csv-Datei zusätzliche Parameter nach dem Dateinamen. Der geänderte code in GROßBUCHSTABEN.
Beispiel:
BEARBEITEN EINE einfachere Methode
Unten ist eine neue version, die einfacher und leichter zu verstehen, weil es eine Liste von Ziel-Elementen statt eines Arrays:
Auch, diese version erfordert nicht die gewünschten Felder werden in Auftrag gegeben.
BEARBEITEN
Oops! Die Parameter für die Sachen, meine Aufmerksamkeit abgelenkt, so dass ich nicht bewusst war, Ihre Letzte Anfrage:
Nur ändern Sie den letzten Teil des Programms, das zu tun:
Können Sie auch entfernen, die Schaffung der überschrift array, weil Sie wollen, NICHT die überschriften! 😉
Absolut perfekt! Hat den trick spot-on, und mehr als leicht genug, um zu passen und zu verwenden mit dos wget für den Upload. Ich danke Ihnen so sehr, in der Tat - und Dank an alle, die eine Antwort geschrieben, bin ich sehr dankbar 🙂
InformationsquelleAutor Aacini
% % @ % % ` (Hier nicht dokumentiert) als start-Variablen max, die Sie bekommen können ist 71:
InformationsquelleAutor Andy Smith
Wenn ich lese, dieses problem wieder und die Lösung vorgeschlagen, in der mit den meisten Stimmen beantworten, dachte ich, dass ein viel einfachere Weise machen guten Gebrauch von einer Reihe von verschachtelten FOR /F-Befehle, die entwickelt werden könnte. Ich begann zu schreiben, wie eine Methode wäre, dass erlaubt die Verwendung von 127 zusätzliche Token platzieren Sie in der ASCII-128-254 Zeichen reichen. Allerdings, wenn mein Programm fertig war, wurde mir entdeckt, dass die ASCII-Zeichen in der "natürlichen" 128..254 Bestellung konnte nicht für diesen Zweck verwendet werden...
Dann, eine Gruppe von Menschen, die daran interessiert waren, dieses problem und Sie machte eine Reihe von Entdeckungen und Entwicklungen, die Ihren Höhepunkt in einer Methode, die es erlaubt zu verwenden viele Token (mehr als 43.000!) in einer Serie von verschachtelten FOR /F-Befehle. Sie können Lesen Sie eine ausführliche Beschreibung von der Forschung und Entwicklung beteiligt an dieser Entdeckung an diese DosTips Thema.
Endlich, ich habe die neue Methode zu ändern, mein Programm, also ist es nun erlaubt die Verarbeitung von bis zu 4094 gleichzeitige Token (aus einer Textdatei mit langen Schlangen), aber in einfacher Weise. Meine Anwendung besteht darin, eine Batch-Datei namens MakeForTokens.bat, dass Sie mit der Anzahl der gewünschten Steine in den parameter. Zum Beispiel:
Generiert das Programm eine Batch-Datei namens ForTokens.bat, enthalten alle notwendigen code, um die Verwaltung einer Menge von gleichzeitigen Token, einschließlich Beispiele, wie, eine Datei zu verarbeiten. Auf diese Weise, der Benutzer muss nur auf Ihre eigenen Dateien einfügen-Namen und gewünschten Token um ein funktionierendes Programm.
In diesem speziellen Fall, wäre das der endgültige ForTokens.bat-Datei, die das problem lösen wie es in dieser Frage, nachdem die meisten beschreibenden Kommentare gelöscht wurden:
Können Sie herunterladen, die MakeForTokens.bat Anwendung von diese Website.
InformationsquelleAutor Aacini