从文件窗口命令行中提取特定行

时间:2014-11-11 08:26:19

标签: batch-file csv

我必须使用批处理文件将csv文件合并到1个文件中。

问题是我只需要每个文件的第三行。

如何从windows命令行/批处理文件中的csv文件中提取特定行?

我发现skip as as命令从文件开头跳过行,但我还需要在我需要的行之后跳过这些文件。

这是我当前的代码(从xls转换为csv后):

for %%i in (headers.csv) do (
    for /f "delims=" %%j in ('type "%%i"') do echo %%j >> combined.csv
)
for %%i in (file*.csv) do (
    for /f "skip=2 delims=" %%j in ('type "%%i"') do echo %%j >> combined.csv
)

2 个答案:

答案 0 :(得分:1)

for %%i in (headers.csv) do (
 set "flag=Y"
 for /f "delims=" %%j in ('type "%%i"') do if defined flag set "flag="&echo %%j >> combined.csv
)
for %%i in (file*.csv) do (
 set "flag=Y"
 for /f "skip=2 delims=" %%j in ('type "%%i"') do if defined flag set "flag="&echo %%j >> combined.csv
)
每次选择新文件时,

flag都会设置为某个值。然后跳过该文件的前两行,并清除第三个标志并再现该行。一旦flag被清除(变得未定义),echo就不会发生。

if defined适用于变量的current(即运行时)值,而不是初始(分析时)值。

答案 1 :(得分:1)

@echo off
    setlocal enableextensions disabledelayedexpansion

    (
        for /f "tokens=1,* delims=:" %%a in ('
            findstr /n "^" headers.csv file*.csv ^| findstr /r /c:"^[^:]*:3:"
        ') do (
            set "line=%%b"
            setlocal enabledelayedexpansion
            echo(!line:~2!
            endlocal
        )
    ) > combined.csv

它将使用findstr从所有指定的文件中检索完整内容(我不确定并且我还包括头文件),并使用行编号。当请求多个文件时,第一个findstr命令的输出将采用

格式
filename.ext:lineNumber:linedata

使用正则表达式过滤第二个findstr,仅从每个文件中检索第三行。

这些行将由for循环处理,使用冒号作为分隔符来删除文件名。为了避免可能以冒号开头的行出现问题,使用子字符串操作删除行号和附加冒号。

如果在最终代码中对文件的引用强制findstr在输出中包含文件的完整路径,则需要将tokens子句更改为tokens=2,*以面对驱动器名称中的冒号。