自动将 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"

如果将命令放在批处理脚本中,则将百分比加倍。

有几种方法可以将换行符附加到文件(如果还没有)(最后一行):

  1. findstr:

    findstr /V "$" "data.csv" > nul && echo/>> "data.csv"
    

    此反向 (/V) 搜索仅在最后一行未被换行符终止时匹配。在这种情况下 && 让下面的命令执行,它只是附加一个换行符。

    限制:

    • 行必须短于 8K 个字符;
  2. find:

    < "data.csv" find /V "" > "data.csv.tmp" && move /Y "data.csv.tmp" "data.csv" > nul
    

    此搜索匹配所有行,find 将换行符附加到每个返回的行,即使是最后一行 none。需要一个临时文件,因为不可能读取和写入同一个文件。如果没有错误发生,&& 将执行下一个命令,将临时文件移动到原始文件上。

    限制:

    • 这需要一个临时文件;
    • 行必须短于 4K 个字符;
  3. more:

    more "data.csv" > "data.csv.tmp" && move /Y "data.csv.tmp" "data.csv" > nul
    

    这只是 returns 所有行; more 将换行符附加到每个返回的行,即使是最后一个 none。需要一个临时文件,因为不可能读取和写入同一个文件。如果没有错误发生,&& 将执行下一个命令,将临时文件移动到原始文件上。

    限制:

    • 这需要一个临时文件;
    • 文件必须短于 64K 行;
    • 行必须短于 64K 个字符;
    • TABs 扩展为 SPACEs;
  4. 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")

请记住,在 .

中使用此代码时,% 符号需要加倍