我有固定宽度的文本文件。 我需要根据列号(列100-120)将内容分隔到一个variables中,并且需要检查variables的长度。
有可能variables有超过20个字符,我需要删除特定的行
例如:
0 1 2 3 4 5 6 7 8 9 0 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 short_name des_shrt px BOS1111 ALTIC 6.62 2_23 106.37500000 BOS2222 AMA 47.26000000 BOS3333 AMB 12.898000 BOS4444 AMEX Express 10.09780000 BOS5555 BBC 111.2233 BOS6666 CNN 123.123445 BOS7777 STACK OVERFLOW 344.9090 BOS8888 STACT 12.0 2/1988 10.99999999 BOS9999 ABC 20
输出:
批处理脚本:从函数1到函数2的局部variables
如何编写一个batch file,我在哪里启动一个程序,当程序完成或closures时,启动另一个程序
如何在批处理中打开一个“空白”窗口
如何以编程方式删除以前的扩展程序< – >程序关联?
batch file将文件从一个目录复制到另一个目录
px 106.375 47.26 12.898 10.0978 111.2233 123.123445 344.909 10.99999999 -> it exceeds 10 digit and should throw error 20
如何从命令行添加多行REG_SZstring到registry?
如何在多个目录中search具有给定扩展名的文件?
windowsbatch file的文件大小和行长度限制
windows脚本循环
在CMD / .bat中,我可以将dir从C更改为D,但不是其他方式?
这是一个纯粹的批处理文件解决方案 – 请参阅代码中的所有解释性说明:
@echo off setlocal EnableDelayedExpansion rem // define constants here: set "_FulL_lines_OUT=#" rem // Initialise variables: set "head=#" rem // Read text file line by line: for /F "usebackq delims=" %%L in ("%~1") do ( rem // Store current line into environment variable: set "liNE=%%L" rem // Extract 12 characters at character position 58: set "liNE=!liNE:~58,12!" rem // Remove trailing spaces,if any: for /F %%K in ("!liNE!") do set "liNE=%%K" rem // Check whether line is the first one (header): if defined head ( rem // Return header line: if defined _FulL_lines_OUT (echo %%L) else (echo !liNE!) set "head=" ) else ( rem // Split numbers into integer and fractional parts: for /F "tokens=1* delims=." %%I in ("!liNE!") do ( set "INT=%%I" & set "FRACT=%%J" ) rem // Remove trailing zeros from fractional part: set "FLAG=#" for /L %%J in (1,1,12) do ( if defined FLAG ( if "!FRACT:~-1!"=="0" ( set "FRACT=!FRACT:~,-1!" ) else ( set "FLAG=" ) ) ) rem // Reassemble truncated decimal number: if defined FRACT ( set "liNE=!INT!.!FRACT!" ) else ( set "liNE=!INT!" ) rem // Check whether string length of number exceeds 10: if not "!liNE:~10!"=="" ( rem // Number is longer than 10 characters: >&2 (if defined _FulL_lines_OUT (echo %%L) else (echo !liNE!)) ) else ( rem // Number is not too long,so return original line: if defined _FulL_lines_OUT (echo %%L) else (echo !liNE!) ) ) ) endlocal exit /B
假设您将脚本命名为check-px-numbers.bat并将您的数据文件命名为D:Datadata.txt ,请像这样运行脚本:
check-px-numbers.bat "D:Datadata.txt" 2> nul
要将输出写入另一个文件D:Datafiltered.txt ,请像这样调用脚本:
check-px-numbers.bat "D:Datadata.txt" > "D:Datafiltered.txt"
这将使用您的示例数据时将返回以下输出文件:
short_name des_shrt px BOS1111 ALTIC 6.62 2_23 106.37500000 BOS2222 AMA 47.26000000 BOS3333 AMB 12.898000 BOS4444 AMEX Express 10.09780000 BOS5555 BBC 111.2233 BOS6666 CNN 123.123445 BOS7777 STACK OVERFLOW 344.9090 BOS9999 ABC 20
并且以下错误消息将出现在控制台窗口中:
BOS8888 STACT 12.0 2/1988 10.99999999
如果您希望输出数据如下所示, set "_FulL_lines_OUT=#"行更改为set "_FulL_lines_OUT=" (或将其删除):
px 106.375 47.26 12.898 10.0978 111.2233 123.123445 344.909 20
如果您想覆盖原始文件,则需要分两步进行:
check-px-numbers.bat "D:Datadata.txt" > "D:Datafiltered.txt" > nul move /Y "D:Datafiltered.txt" "D:Datadata.txt"
要将错误的行写入文件,请使用以下命令:
check-px-numbers.bat "D:Datadata.txt" 2> "D:Dataerrors.txt"
你可以结合这个一次写入过滤和错误行,像这样:
check-px-numbers.bat "D:Datadata.txt" > "D:Datafiltered.txt" 2> "D:Dataerrors.txt"
总结以上是内存溢出为你收集整理的如何根据列号分隔固定宽度的文本文件全部内容,希望文章能够帮你解决如何根据列号分隔固定宽度的文本文件所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)