我想删除csv文件的第1行和第3行到第19行。我可以删除所有19行,但不能保留我需要的行(第2行)通过使用其他帖子,我的脚本如下所示
@echo off
set "csv=test.csv"
more +1 "%csv%" >"%csv%.new"
move /y "%csv%.new" "%csv%" >nul
----missing instruction ---
more +17 "%csv%" >"%csv%.new"
move /y "%csv%.new" "%csv%" >nul
所以我删除了第一行(然后我想要的行现在位于顶部),并且我想从第二行开始删除17行。我不知道如何跳过第一行。
答案 0 :(得分:2)
(
set /p unused=
set /p line2=
)<%csv%
echo %line2%>%csv%.new
more +19 %csv% >>%csv%.new
rem move /y "%csv%.new" "%csv%" >nul
当它看起来不错时删除rem
答案 1 :(得分:1)
如果您的文件只有19行,那么您只想保留第2行。最简单的解决方案是翻转逻辑并担心您要保留的行。
以下是提取第二行的几个选项。
此限制为最大行长度1021,并且将删除尾随控制字符。
@echo off
setlocal enableDelayedExpansion
set "csv=test.csv"
<"%csv%" (
set /p "ln="
set /p "ln="
)
(echo(!ln!)>"%csv%"
使用FOR / F支持最长接近8191的线路长度。
@echo off
setlocal
set "csv=test.csv"
for /f "usebackq skip=1 delims=" %%A in ("%csv%") do (
(echo(%%A)>"%csv%"
goto :break
)
:break
如果您知道目标行不是以:
开头,那么
@echo off
setlocal
set "csv=test.csv"
for /f "tokens=1* delims=:" %%A in (
'findstr /n "^" "%csv%" ^| findstr /b "2:"'
) do (echo(%%B)>"%csv%"
<强> 修改 强>
现在我知道源文件超过19行,而不是使用Stephan's answer,除非出现以下限制之一:
如果上述任何限制都存在问题,并且所有行的长度都小于8191个字符,并且没有行以:
开头,则以下内容将起作用。但它的速度较慢。
@echo off
setlocal
set "csv=test.csv"
>"%csv%.new" (
for /f "tokens=1* delims=:" %%A in ('findstr /n "^" "%csv%"') do (
if %%A equ 2 echo(%%B
if %%A gtr 19 echo(%%B
)
)
move /y "%csv%.new" "%csv%" >nul
但如果您想要一个没有任何限制的快速解决方案,那么您可以使用我的REPL.BAT utility - 一个混合JScript /批处理脚本,它在stdin上执行正则表达式搜索/替换操作并将结果写入stdout。它是纯脚本,可以在任何现代Windows机器上从XP开始本地运行。完整的文档嵌入在脚本中。
@echo off
setlocal
set "csv=test.csv"
findstr /n "^" "%csv%"|repl "^(1|10|11|12|1?[3456789]):" ":"|repl "^\d+:" "" A >"%csv%.new"
move /y "%csv%.new" "%csv%" >nul
最初的FINDSTR只是在每行前面加上行号,然后是冒号。
第一个REPL删除冒号前的行号,如果它是1或3-19
最后一个REPL删除以数字后跟冒号开头的任何前缀,并丢弃未修改的行。