我对批处理文件比较陌生,这就是我要做的事情:
我有一个文件夹,其中包含几个名为:
的csv文件Thu_Oct_26_11-12-07_BST_2017+testa.csv
Thu_Oct_26_11-12-07_BST_2017+testb.csv
文件中的文字是|
分开的,即
Peg|Adoption|Indonesia|1980|
Peg|Adoption|Indonesia|1981|
我有一个批处理代码,将文件名放在csv文件中每行的前面
::add filename
for /f %%a in ('dir /b ^"C:\Temp\CSV\Countries\*.csv^"'
) do (
for /f "tokens=*" %%b in (%%a
) do echo %%a^|%%b >> "C:\Temp\CSV\Countries\import_temp\%%a")
pause
上面的工作是将整个名称添加到行的前面,但我只想将文件名的日期部分添加到行中。我尝试使用%%a
从:~0,10
中选择一个子字符串,但这仍然会粘贴整个字符串
::add filename
for /f %%a in ('dir /b ^"C:\Temp\CSV\Countries\*.csv^"'
) do (
for /f "tokens=*" %%b in (%%a
) do echo %%a:~0,10^|%%b >> "C:\Temp\CSV\Countries\import_temp\%%a")
pause
我还尝试设置一个等于%%a
子字符串的新变量,但这会打印%c
而不是文件名的第一部分
::add filename
for /f %%a in ('dir /b ^"C:\Temp\CSV\Countries\*.csv^"'
) do (
set c=%%a:~0,10
for /f "tokens=*" %%b in (%%a
) do echo %%c^|%%b >> "C:\Temp\CSV\Countries\import_temp\%%a")
pause
是否有人能够表明我做错了什么?
答案 0 :(得分:0)
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
MD "%sourcedir%\import_temp" 2>NUL
::add filename
for /f %%a in ('dir /b "%sourcedir%\*.csv"'
) do (
for /f "tokens=1-3delims=_" %%B in ("%%a"
) do echo %%B_%%C_%%D^|%%a >> "%sourcedir%\import_temp\%%a"
)
GOTO :EOF
您需要更改sourcedir
的设置以适合您的具体情况。
我添加了md
来强制生成import_temp
子目录。 2>nul
用于抑制目录已存在的投诉。
为了区分目的,我改变了内循环中使用的元变量的大小写。使用%%a
作为分隔符将字符串_
分析为标记,并选择前3个标记将%%a
中的每个子字符串分配到%%B
... %%D
,所需要的只是重新组合日期并将其与仅包含文件名的%%a
连接起来。请注意,for
循环的元变量是cmd
区分大小写的少数几个地方之一。
不需要在"
中转义dir
的插入符号。