加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

Windows Batch读取文件并将行解析为标记和变量

发布时间:2020-12-14 02:03:41 所属栏目:Windows 来源:网络整理
导读:通过搜索这个网站并学习 Windows批处理脚本的荒谬语言,我取得了很大的进展,但我现在处于一个被困的地步.我有一个文本文件,行数可变,每个行看起来像: AA8315,"United States",N777AN,"American Airlines",AAL98,B772,"Boeing 777-223",AAL,"2013-06-11 23:30
通过搜索这个网站并学习 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"

我的批处理文件:

set THEDATE=2013-06-12
set THEDATABASE=c:KineticBaseStationBasestation.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%
)

(我将令牌分配给变量,因为我将在以后进行额外的验证和格式化.我需要先让这部分工作!)

执行时,脚本确实循环遍历文件的每一行,但它似乎没有将%% 1分配给变量hexcode.

执行命令的输出如下所示:

C:&;for /F "usebackq tokens=1,]" %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=,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循环中逗号分隔值的问题.以下是我为使您的代码工作所做的工作.

的test.txt

AA8315,"2013-06-12 00:01:14.459"

BatchFile.bat

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,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%,%lastseen%
    echo %THISLINE% > %THEOUTPUTFILE%
)

:TheEnd

注意:process_line for循环.我不得不在%the_line%周围添加单引号,因此它没有尝试将字符串解释为文件名.然后我用?字符替换了所有逗号,并使用?字符作为分隔符.它可能无法准确处理所有数据(如果它包含单引号或?字符),但它确实可以使用这一条记录并让您再次朝着正确的方向前进.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读