我有一个文本文件,我想使用批处理脚本删除每行中所有结尾的0,直到第19行
我已经编写了用于查找特定行的代码。而且不知道如何前进
我希望修改文本文件,而每行不以0结尾
novamth.txt文件
ATC4 C 5 0
CTY C 3 0
CTY_DESCR C 21 0
E_DT_PRTEXP C 43 0
E_YR_PRTEXP C 41 0
GEN_PRD C 28 0
LNCH_STATUS C 22 0
MNF C 18 0
NAME_TYPE C 22 0
NFC123 C 3 0
PRD C 18 0
PRE_PST_EXP C 28 0
PROT_ECTION C 24 0
REL_PROT_EXP_MTH C 40 0
REL_PROT_EXP_YR C 31 0
STR C 6 0
INTSTR C 52 0
PCK C 31 0
INTPCK C 72 0
KG MTH_04_2017 N 35 15
KG MTH_05_2017 N 35 15
KG MTH_06_2017 N 35 15
KG MTH_07_2017 N 35 15
KG MTH_08_2017 N 35 15
bat文件以查找特定行
@echo off & setlocal EnableDelayedExpansion
set LineNumber=19
set FileName=C:\PADDS\bat\nova\novamth.txt
set counter=0
for /F "delims=" %%j in ('type "%FileName%"') do (
set /A counter+=1
if !counter! equ %LineNumber% (echo.%%j> "myline.txt" & goto :END)
)
:END
答案 0 :(得分:1)
根据您的需求,您可以选择几种方法,但是,让我们来解决一下您已经具备的基本知识,因为您几乎可以使用它了!
我将用“”包裹您的集合,这样我们就不会在其中包含任何错误的字符。
@(
SetLocal EnableDelayedExpansion
Echo off
)
set "LineNumber=19"
set "FileName=C:\PADDS\bat\nova\novamth.txt"
set "counter=1"
For /F "tokens=*" %%j in ('type "%FileName%"') do (
Set /A "counter+=1"
Set "_Line=%%j"
IF /I !counter! leq %LineNumber% (
Set "_Line=!_Line:~0,-1!"
)
echo(!_Line!>> "myline.txt"
)
:END
(
EndLocal
Exit /B
)
我将行存储在临时变量_Line
中,并从该字符串中删除“最后一个字符”,因为看来您没有任何尾随空格,这是最简单的方法。
此更改仅发生在前19行,之后我们按原样编写。
>>
用于附加到文件,因为>
每次写入一行时都会被覆盖。
在上述版本中,该版本适用于所提供的数据,这将删除所有0。如果行的最后一位以外的其他位置可能出现0,则可以更改此设置。我当时在手机上写这篇文章,以为我已经编辑过以包含该信息,但是现在还没有,所以这应该有所帮助:)
无论如何,如果您确实拥有可以为0的数据,那么我们至少可以假设总是有4个项吗?
此外,有没有看起来像没有空格的尾部空格,所以我会假设吗?
您需要保留所有空间吗? (我假设是)即使是最后0之前的那些? (我现在假设是,但是您将看到它们很容易删除)
在编写下一个迭代时,我将假定上述答案。
我对此作了进一步修改,以提供创建的文件的明确输出,以供作者查看,因为作者无法找到它。
在添加路径变量供作者进行编辑时,我也略微更改了变量。
我还决定添加它,以防输出文件已经存在,如果作者之前已经运行过它,尽管没有特别要求,但还是删除了。
REM Script: %~f0
REM Version: 1.0.0
@(
SetLocal EnableDelayedExpansion
Echo off
)
SET "_LineNumber=19"
SET "_SourceFileName=C:\PADDS\bat\nova\novamth.txt"
SET "_OutputFileName=C:\PADDS\bat\nova\myline.txt"
SET "_Counter=1"
DEL /F /Q "%_OutputFileName%"
For /F "tokens=*" %%j in ('type "%_SourceFileName%"') do (
SET /A "_Counter+=1"
SET "_Line=%%j"
IF /I !_Counter! leq %_LineNumber% (
FOR /F "Tokens=1-3 Delims=ABCDEFGHIJKLMNOPQRSTUVWXYZ_012345678910" %%J IN ("%%j") DO @(
SET "_Space_1=%%J"
SET "_Space_2=%%K"
SET "_Space_3=%%L"
)
FOR /F "Tokens=1-3 Delims= " %%J IN ("%%j") DO @(
SET "_Line=%%J!_Space_1!%%K!_Space_2!%%L!_Space_3!"
)
)
echo(!_Line!>>"%_OutputFileName%"
)
(
ECHO. Check the File "%_OutputFileName%"
EndLocal
Exit /B
)
在上面,我现在开始使用整行,如果计数小于或等于19,我们可以通过使用所有非空格字符轻松地使用第二个循环来获取空格集可能希望代替分隔符而不是空格。
这使我们能够将每个术语之间的所有空格捕获到一些变量中。
此后的For循环会自行捕获条款并重新使用for循环变量,因为它们在上一个循环中被破坏一次。
这里,我们不需要分配_Line变量以外的任何变量,因为我们已经收集了所需的所有信息。因此我们使用保存数据的术语并将其与上一步中找到的Spaces变量分开。
一旦我们构造了新的LINE变量,我们就可以使用If语句完成操作,现在不需要单独的ECHO语句了(老实说,即使是第一个,也没有,但是我很快就写了)移动,而且看起来更短些似乎更容易。
(我还修改了原件,使其没有单独的回声,但我总是更喜欢这样做,因为我觉得它更干净。)
我对此进行了修改,以在可编辑的变量中为文件提供特定的输出路径,并在CMD行上提供该路径。
在CLI上运行CMD脚本的示例:
Y:\>C:\PADDS\bat\nova\testnovamth.cmd
Y:\>REM Script: C:\PADDS\bat\nova\testnovamth.cmd
Y:\>REM Version: 1.0.0
Check the File "C:\PADDS\bat\nova\myline.txt"
Y:\>
脚本的示例输出:
ATC4 C 5
CTY C 3
CTY_DESCR C 21
E_DT_PRTEXP C 43
E_YR_PRTEXP C 41
GEN_PRD C 28
LNCH_STATUS C 22
MNF C 18
NAME_TYPE C 22
NFC123 C 3
PRD C 18
PRE_PST_EXP C 28
PROT_ECTION C 24
REL_PROT_EXP_MTH C 40
REL_PROT_EXP_YR C 31
STR C 6
INTSTR C 52
PCK C 31
INTPCK C 72 0
KG MTH_04_2017 N 35 15
KG MTH_05_2017 N 35 15
KG MTH_06_2017 N 35 15
KG MTH_07_2017 N 35 15
KG MTH_08_2017 N 35 15