我通过search这个网站并学习了一些荒谬的语言,即Windows批处理脚本,取得了很大进展,但是现在我陷入了困境。 我有一个可变数量的行的文本文件,其中每个看起来像这样:
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"
我的batch file:
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% )
(我将令牌分配给variables,因为我将在以后进行额外的validation和格式化,我需要先让这部分工作!)
当执行时,脚本确实循环遍历文件的每一行,但是它似乎没有将%%1
赋值给variableshexcode
。
执行的命令的输出如下所示:
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.
任何帮助是极大的赞赏!
在for
循环中,我总是遇到逗号分隔值的问题。 以下是我所做的工作。
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"
set THECSVFILE=test.txt ::read %THECSVFILE% and loop through each line for /F "usebackq tokens=* delims=" %%A in (%THECSVFILE%) do ( set the_line=%%A call :process_line ) goto TheEnd :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% ) :TheEnd
注意:process_line for
循环。 我不得不在%the_line%
周围添加单引号,所以它不会将字符串解释为文件名。 然后我用〜字符替换所有的逗号,并使用〜字符作为分隔符。 它可能不适用于所有的数据(如果它包含单引号或〜字符),但它确实与这一个记录一起工作,并使您再次朝着正确的方向移动。
这在这里工作:
(“AA8315”,“美国”,N777AN,“美国航空”,AAL98,B772,“波音777-223”,AAL,“2013-06- 11 23:30:47.923“,”2013-06-12 00:01:14.459“”)do( 设置十六进制= %% a set country = %% b 设置reg = %% c 设置所有者= %% d 设置callsegn = %% e 设置planefype = %% f 设置模型= %%克 设置opflag = %% h 设置firstseen = %%我 设置lastseen = %% j set THISLINE = %% a,%% b,%% c,%% d,%% e,%% f,%% g,%% h,%% i,%% j ) >“c:\ FlightsNew.csv”echo%THISLINE%
我不确定,为什么你需要令牌。
你只能使用字母来代替变量(代码中的%%1
) – 但小写字母和大写字母是不同的。
是的,你可以使用一些其他的字符,但"tokens=1-10"
(这是一个更容易的1,2,3版本)的连续块是a..z和A..Z
%0 ..%9是为批处理或批处理过程的参数保留的。