Windows-Batch-Datei Lesen und Parsen Linien in tokens und Variablen
Habe ich ein gutes Geschäft gemacht der Fortschritte durch die Suche auf dieser Website und lernen die lächerliche Sprache, die Windows batch-scripting, aber ich bin jetzt an einem Punkt, wo ich stecken geblieben bin. Ich habe eine text-Datei mit einer Variablen Anzahl von Zeilen, von denen jede in etwa so aussieht:
AA8315,"United States",N777AN,"American Airlines",AAL98,B772,"Boeing 777-223",AAL,"2013-06-11 23:30:47.923","2013-06-12 00:01:14.459"
Meine batch-Datei:
set THEDATE=2013-06-12
set THEDATABASE=c:\Kinetic\BaseStation\Basestation.sqb
set THECSVFILE=c:\Flights.csv
set THEOUTPUTFILE=c:\FlightsNew.csv
set THISLINE=""
if exist %THECSVFILE% del %THECSVFILE%
if exist %THEOUTPUTFILE% del %THEOUTPUTFILE%
:: allow time for the csv file to be deleted
timeout /t 2 /nobreak
c:\sqlite3.exe -header -csv %THEDATABASE% "select Aircraft.ModeS, Aircraft.ModeSCountry as Country, Aircraft.Registration as Reg, Aircraft.RegisteredOwners as Owner, Flights.Callsign, Aircraft.ICAOTypeCode as Type, Aircraft.Type as Model, Aircraft.OperatorFlagCode as 'Op Flag', Flights.StartTime as 'First Seen', Flights.EndTime as 'Last Seen' from Aircraft INNER JOIN Flights ON (Aircraft.AircraftID=Flights.AircraftID) where Flights.EndTime like '%THEDATE% %%' order by Flights.EndTime DESC;" >> %THECSVFILE%
::allow time for the csv to be written to file
timeout /t 5 /nobreak
::read %THECSVFILE% and loop through each line
for /F "usebackq tokens=* delims=" %%A in (%THECSVFILE%) do (
set the_line=%%A
call :process_line
)
:process_line
for /F "usebackq tokens=1,2,3,4,5,6,7,8,9,10 delims=[,]" %%1 in (%the_line%) do (
set hexcode=%%1
set country=%%2
set reg=%%3
set owner=%%4
set callsign=%%5
set planetype=%%6
set model=%%7
set opflag=%%8
set firstseen=%%9
set lastseen=%%10
set THISLINE=%hexcode%,%country%,%reg%,%owner%,%callsign%,%planetype%,%model%,%opflag%,%firstseen%,%lastseen%
echo %THISLINE% > %THEOUTPUTFILE%
)
(Ich bin die Zuordnung der Token zu Variablen, denn ich werde tun, eine zusätzliche Validierung und Formatierung von Ihnen später. Ich brauche, um diesen Teil der Arbeit zuerst!)
Ausgeführt, wenn das Skript tatsächlich eine Schleife durch jede Zeile in der Datei, jedoch scheint es nicht zu zuordnen %%1
auf die variable hexcode
.
Die Ausgabe des ausgeführten Befehls sieht wie folgt aus:
C:\>for /F "usebackq tokens=1,2,3,4,5,6,7,8,9,10 delims=[,]" %1 in (AA8315 "United States" N777AN "American Airlines" AAL98 B772 "Boeing 777-223" AAL "2013-06-11 23:30:47.923" "2013-06-12 00:01:14.459") do (
set hexcode=%1
set country=%2
set reg=%3
set owner=%4
set callsign=%5
set planetype=%6
set model=%7
set opflag=%8
set firstseen=%9
set lastseen=%10
set THISLINE=,"United States" ,N807FD ,"Fedex Express" ,FDX1378 ,,"Airbus A310-324" ,FDX ,"2013-06-12 22:56:54.639" ,"2013-06-12 23:05:31.822"
echo "" 1>c:\FlightsNew.csv
)
The system cannot find the file AA8315.
Jede Hilfe wird sehr geschätzt!
- +1 für eigene nachforschungen zu betreiben und zu versuchen, um eine Lösung auf eigene Faust, bevor Sie Fragen stellen, und für den code in deiner Frage!
- ABER - ich glaube, du wärst besser indem die gesamte Zeile als parameter an die Prozedur, dann bauen Sie Ihre Variablen aus %1..%9 mit
SHIFT
in der herkömmlichen Art und Weise. So, Land, Namen wie "Kongo, Demokratische Republik" behandelt werden, als einen einzigen string. Versuchen Sie es, indem Sie ein Komma zwischen "United" und "Staaten" in Ihrer Daten-Datei und sehen Sie den Unterschied.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte schon immer Probleme mit Komma getrennte Werte in einem
for
Schleife. Hier ist, was ich Tat, um Ihren code zu arbeiten.Test.txt
BatchFile.bat
Beachten Sie die :process_line
for
Schleife. Ich hatte zum hinzufügen von Anführungszeichen%the_line%
so dauerte es nicht versuchen, interpretiert den string als Dateinamen. Dann ersetzte ich alle Kommas mit dem Zeichen ~ und die ~ als Trennzeichen. Es kann nicht funktionieren, genau auf alle Ihre Daten (wenn es enthält einfache Anführungszeichen oder das Zeichen~), aber es funktioniert mit dieser einen Datensatz und bringt Sie in die richtige Richtung wieder.echo is OFF
.lastseen
- Sie werden feststellen, dass es die gleiche wie die erste,hexcode
mit einer angehängten0
Darüber hinaus arbeiten, die schließende Klammer derDO
im:process_line
müsste nach derset lastseen
- ansonsten die angezeigten Werte werden den Werten VOR tahtfor/f
ausgeführt wurde - eventuell die veralteten Werte aus dem letzten Lauf. Weitere, die>
werden müssten>>
anfügen die neuen Daten line-by-line.echo %THISLINE% >> %THEOUTPUTFILE%
(mit zwei >).%%1
thru%%10
funktioniert Prima. Ich bin mir nicht sicher, was es war, über das Komma, Sie war schon immer problematisch für mich. Statt tief Graben, um herauszufinden, warum, ich habe immer nur ersetzte Sie mit~
und verwendet als Trennzeichen, die schon immer wirksam waren. Vielleicht eines Tages, wenn ich noch etwas Zeit übrig haben, werde ich versuchen, zu entdecken, warum...dieser hier funktioniert:
Ich bin mir nicht sicher, warum Sie benötigen, um die Jetons.
Können Sie nur verwenden, Briefe her, die metavariable (
%%1
im code), aber für die Kleinbuchstaben und Großbuchstaben sind Verschieden.Ja, Sie können einige andere Charaktere, aber das zusammenhängende Blöcke verfügbar für
"tokens=1-10"
(das ist eine einfachere version von 1,2,3,...) sind a..z und A..Z%0..%9 sind reserviert für die Parameter der batch-oder batch-Verfahren.
for
Schleife.