我必须使用批处理文件将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
)
答案 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,*
以面对驱动器名称中的冒号。