如何删除.csv文件中的第1行和第3行到第19行?

时间:2014-04-03 09:50:01

标签: batch-file

我想删除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行。我不知道如何跳过第一行。

2 个答案:

答案 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,除非出现以下限制之一:

  • SET / P行中读取的字符不能超过1021个字符
  • MORE会将标签转换为空格字符串
  • 如果文件足够大(我认为超过64K行),那么输出最终会挂起,等待按键,即使重定向更多输出。

如果上述任何限制都存在问题,并且所有行的长度都小于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删除以数字后跟冒号开头的任何前缀,并丢弃未修改的行。