批处理文件/自动化,以将LF和CR(EOL)添加到多个.csv文件的末尾

时间:2016-03-10 18:37:40

标签: csv batch-file eol lf

我有一堆外部生成的.csv个文件,并定期发送给我。它们每个都包含一行带有31"列"的文本。但是,它们都没有EOL(没有LF本身或CR),所以当我尝试组合任何这些文件时,我在同一行上获得更多列,而不是一行每个文件。

我想要一种方法来自动将其添加到批处理中每个文件的末尾,输出与原始文件具有相同的文件名,可能在名称的开头添加了一个字符我新的这个过程完成了。 Ex: originalFile.csv>> 1_originalFile.csv

我曾尝试创建一个名为" eol.csv"的文件。这只是(LF和CR),并创建一个批处理,将其添加到我的所有文件的末尾,但由于我是编写批处理文件的新手,我显然是不成功的。

如果可以在每个文件放入文件夹时执行此操作,那就更好了。

感谢您对此的任何想法!

4 个答案:

答案 0 :(得分:4)

FINDSTR正则表达式$将行尾识别为回车前的位置。所以findstr /v $只会匹配不包含回车符的行。您可以使用此事实将回车符/换行符仅附加到需要它的文件中,而无需重命名任何文件。

命令行中的以下一个衬垫就是您所需要的:

for /f "eol=: delims=" %F in ('findstr /m /v $ *.csv') do @(echo()>>"%F"

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

答案 1 :(得分:1)

由于所有echo以CRLF结尾,并且您可以使用echo/自行回显CLRF,因此您只需使用输出重定向将CLRF附加到每个csv文件。 / p>

如果你想在你拖放到脚本上的一堆文件上运行它,它将如下所示:

@for %%A in (%*) do echo/ >>%%A

顺便说一下,这一行就是整个剧本。

答案 2 :(得分:1)

这将搜索字符串.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" 
    )
)

答案 3 :(得分:0)

有几种方法可以将换行符附加到文件的最后一行(如果尚不存在):

  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会将换行符附加到每条返回的行中,即使没有的最后一行也是如此。由于无法读取和写入同一文件,因此需要一个临时文件。如果没有错误发生,&&将执行下一个命令,该命令会将临时文件移至原始文件。

    限制:

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

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

    这只会返回所有行; more会将换行符附加到每条返回的行中,即使最后一行都没有时也是如此。由于无法读取和写入同一文件,因此需要一个临时文件。如果没有错误发生,&&将执行下一个命令,该命令会将临时文件移至原始文件。

    限制:

    • 这需要一个临时文件;
    • 文件必须短于64K行;
    • 行必须少于64K个字符;
    • TABs 扩展为 SPACEs ;
  4. sort

    sort "data.csv" /+65535 /REC 65535 | sort /+65535 /REC 65535 /O "data.csv"
    

    这只会返回所有行; sort会将换行符附加到每条返回的行中,即使最后一行都没有时也是如此。令人惊讶的是,不需要临时文件(我测试了约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")

请记住,在中使用此代码时,%-符号需要加倍。