自动将 LF 和 CR (EOL) 添加到多个 .csv 文件的末尾
Automation to add a LF and CR (EOL) to the end of multiple .csv files
我有一堆 .csv
外部生成并定期发送给我的文件。它们每个都包含一行 31 "columns" 的文本。然而,其中 None 个有任何类型的 EOL
(没有 LF 本身或与 CR),所以当我尝试组合这些文件中的任何一个时,我在同一行上得到更多列,而不是每个文件一行。
我想要一种自动将其批量添加到每个文件末尾的方法,输出具有与原始文件相同的文件名,可能会在文件的开头添加一个字符name so I new 这个过程就完成了。 Ex: originalFile.csv>> 1_originalFile.csv
.
我试图创建一个名为“eol.csv
”的文件,它只是(LF 和 CR),并创建一个批处理将其添加到我所有文件的末尾,但正如我作为编写批处理文件的新手,我非常不成功。
如果可以在将每个文件放入文件夹时执行此操作,那就更好了。
感谢您对此的任何想法!
由于所有 echo
都以 CRLF 结尾,并且您可以使用 echo/
自行回显 CLRF,因此您可以简单地使用输出重定向将 CLRF 附加到每个 csv 文件.
如果你想运行在你拖放到脚本上的一堆文件上这样做,它看起来像这样:
@for %%A in (%*) do echo/ >>%%A
顺便说一下,这一行就是整个脚本。
这将在所有 .csv
文件名中搜索字符串 _fixed
,如果没有,将插入一个空行并重命名。当然,将 pathToWherever
替换为适合您的正确路径,并且可以添加 /s
选项以允许在命名路径中的子文件夹中进行搜索。
@echo off
for /r "C:\pathToWherever\" %%G in (*.csv) do (
echo %%G | findstr /c:"_fixed" || (
echo:>>%%G
ren "%%G" "%%~nG_fixed.csv"
)
)
FINDSTR 正则表达式 $
将行尾识别为紧接在回车 return 之前的位置。所以 findstr /v $
只会匹配不包含回车 return 的行。您可以使用此事实将回车符 return/linefeed 附加到仅需要它的文件,而无需重命名任何文件。
命令行中的以下一行代码就是您所需要的:
for /f "eol=: delims=" %F in ('findstr /m /v $ *.csv') do @(echo()>>"%F"
如果将命令放在批处理脚本中,则将百分比加倍。
有几种方法可以将换行符附加到文件(如果还没有)(最后一行):
-
findstr /V "$" "data.csv" > nul && echo/>> "data.csv"
此反向 (/V
) 搜索仅在最后一行未被换行符终止时匹配。在这种情况下 &&
让下面的命令执行,它只是附加一个换行符。
限制:
- 行必须短于 8K 个字符;
find
:
< "data.csv" find /V "" > "data.csv.tmp" && move /Y "data.csv.tmp" "data.csv" > nul
此搜索匹配所有行,find
将换行符附加到每个返回的行,即使是最后一行 none。需要一个临时文件,因为不可能读取和写入同一个文件。如果没有错误发生,&&
将执行下一个命令,将临时文件移动到原始文件上。
限制:
- 这需要一个临时文件;
- 行必须短于 4K 个字符;
more
:
more "data.csv" > "data.csv.tmp" && move /Y "data.csv.tmp" "data.csv" > nul
这只是 returns 所有行; more
将换行符附加到每个返回的行,即使是最后一个 none。需要一个临时文件,因为不可能读取和写入同一个文件。如果没有错误发生,&&
将执行下一个命令,将临时文件移动到原始文件上。
限制:
- 这需要一个临时文件;
- 文件必须短于 64K 行;
- 行必须短于 64K 个字符;
- TABs 扩展为 SPACEs;
sort
:
sort "data.csv" /+65535 /REC 65535 | sort /+65535 /REC 65535 /O "data.csv"
这只是 returns 所有行; sort
将换行符附加到每个返回的行,即使是最后一个 none。令人惊讶的是,不需要临时文件(我测试了一个 ~ 30 MB 的文件,没有因 I/O 冲突而丢失数据)。然而,这可能是这里最慢的方法,因为管道 (|
).
关键是设置一个超出数据的字符位置进行排序。在这种情况下,sort
似乎只是恢复整个文件;这就是使用两个 sort
命令的原因。但是我在 Windows 7 上用一个文件很快地测试了它,所以你应该谨慎对待它。
限制:
- 行必须短于 64K 个字符;
上述所有方法都可以在 for
loop 中轻松实现,以便应用于多个文件;然后只需将 data.csv
替换为 for
元变量(在变体 1 上演示。此处):
for %I in ("*.csv") do @(findstr /V "$" "%~I" > nul && echo/>> "%~I")
请记住,在 batch-file.
中使用此代码时,%
符号需要加倍
我有一堆 .csv
外部生成并定期发送给我的文件。它们每个都包含一行 31 "columns" 的文本。然而,其中 None 个有任何类型的 EOL
(没有 LF 本身或与 CR),所以当我尝试组合这些文件中的任何一个时,我在同一行上得到更多列,而不是每个文件一行。
我想要一种自动将其批量添加到每个文件末尾的方法,输出具有与原始文件相同的文件名,可能会在文件的开头添加一个字符name so I new 这个过程就完成了。 Ex: originalFile.csv>> 1_originalFile.csv
.
我试图创建一个名为“eol.csv
”的文件,它只是(LF 和 CR),并创建一个批处理将其添加到我所有文件的末尾,但正如我作为编写批处理文件的新手,我非常不成功。
如果可以在将每个文件放入文件夹时执行此操作,那就更好了。
感谢您对此的任何想法!
由于所有 echo
都以 CRLF 结尾,并且您可以使用 echo/
自行回显 CLRF,因此您可以简单地使用输出重定向将 CLRF 附加到每个 csv 文件.
如果你想运行在你拖放到脚本上的一堆文件上这样做,它看起来像这样:
@for %%A in (%*) do echo/ >>%%A
顺便说一下,这一行就是整个脚本。
这将在所有 .csv
文件名中搜索字符串 _fixed
,如果没有,将插入一个空行并重命名。当然,将 pathToWherever
替换为适合您的正确路径,并且可以添加 /s
选项以允许在命名路径中的子文件夹中进行搜索。
@echo off
for /r "C:\pathToWherever\" %%G in (*.csv) do (
echo %%G | findstr /c:"_fixed" || (
echo:>>%%G
ren "%%G" "%%~nG_fixed.csv"
)
)
FINDSTR 正则表达式 $
将行尾识别为紧接在回车 return 之前的位置。所以 findstr /v $
只会匹配不包含回车 return 的行。您可以使用此事实将回车符 return/linefeed 附加到仅需要它的文件,而无需重命名任何文件。
命令行中的以下一行代码就是您所需要的:
for /f "eol=: delims=" %F in ('findstr /m /v $ *.csv') do @(echo()>>"%F"
如果将命令放在批处理脚本中,则将百分比加倍。
有几种方法可以将换行符附加到文件(如果还没有)(最后一行):
-
findstr /V "$" "data.csv" > nul && echo/>> "data.csv"
此反向 (
/V
) 搜索仅在最后一行未被换行符终止时匹配。在这种情况下&&
让下面的命令执行,它只是附加一个换行符。限制:
- 行必须短于 8K 个字符;
find
:< "data.csv" find /V "" > "data.csv.tmp" && move /Y "data.csv.tmp" "data.csv" > nul
此搜索匹配所有行,
find
将换行符附加到每个返回的行,即使是最后一行 none。需要一个临时文件,因为不可能读取和写入同一个文件。如果没有错误发生,&&
将执行下一个命令,将临时文件移动到原始文件上。限制:
- 这需要一个临时文件;
- 行必须短于 4K 个字符;
more
:more "data.csv" > "data.csv.tmp" && move /Y "data.csv.tmp" "data.csv" > nul
这只是 returns 所有行;
more
将换行符附加到每个返回的行,即使是最后一个 none。需要一个临时文件,因为不可能读取和写入同一个文件。如果没有错误发生,&&
将执行下一个命令,将临时文件移动到原始文件上。限制:
- 这需要一个临时文件;
- 文件必须短于 64K 行;
- 行必须短于 64K 个字符;
- TABs 扩展为 SPACEs;
sort
:sort "data.csv" /+65535 /REC 65535 | sort /+65535 /REC 65535 /O "data.csv"
这只是 returns 所有行;
sort
将换行符附加到每个返回的行,即使是最后一个 none。令人惊讶的是,不需要临时文件(我测试了一个 ~ 30 MB 的文件,没有因 I/O 冲突而丢失数据)。然而,这可能是这里最慢的方法,因为管道 (|
).关键是设置一个超出数据的字符位置进行排序。在这种情况下,
sort
似乎只是恢复整个文件;这就是使用两个sort
命令的原因。但是我在 Windows 7 上用一个文件很快地测试了它,所以你应该谨慎对待它。限制:
- 行必须短于 64K 个字符;
上述所有方法都可以在 for
loop 中轻松实现,以便应用于多个文件;然后只需将 data.csv
替换为 for
元变量(在变体 1 上演示。此处):
for %I in ("*.csv") do @(findstr /V "$" "%~I" > nul && echo/>> "%~I")
请记住,在 batch-file.
中使用此代码时,%
符号需要加倍