【问题标题】:Merging of csv breaks diacritical characters合并 csv 会破坏变音字符
【发布时间】:2017-03-15 10:09:46
【问题描述】:

我正在尝试合并一些 csv 文件。我在 Windows 上使用 cmd 执行此操作,例如 type *.csv >> 或使用包含

的批处理文件
echo. > all.csv
for %%a in (*.csv) DO copy /b alle.csv+%%a all.csv

在一台计算机(win7x64)上合并没问题。但是在另一个(相同的 win7x64)上,所有变音字符(德语:äüöß)都被破坏了 - 而不是它们,只有 ´,,´。

应该合并的源文件具有正常的变音字符 - 我用 Notepad++ 和 Excel 打开它们,作为 ANSI 或 Unicode - 一切正常。

如何调整文件合并以保存变音符号?

【问题讨论】:

  • 正如@MCNDs 的评论中提到的回答命令echo. > all.csv 将在所有附加内容前插入一个空格,如果 csv 文件是带有 BOM 的 unicode 格式,则生成的文件将无效因为 BOM 只需要在第一个字节中
  • 你的意思是all.csv,而不是你的代码中的alle.csv,对吧?无论如何,要创建一个空文件,请使用> all.csv rem/> all.csv break;使用echo. > all.csv 将一个空格和一个换行符写入文件...

标签: windows csv batch-file cmd merge


【解决方案1】:

我认为有几个问题会导致意外结果:

  1. 您尝试通过echo. > all.csv 创建一个空文件,但这实际上导致文件包含 SPACE,后跟换行符 (CR + LF),ANSI 编码。所以你可能有不同编码的文件,这可能会导致麻烦。

    要真正创建一个空文件,请使用rem/ > all.csvbreak > all.csvtype nul > all.csvcopy /Y nul all.csv

  2. 将文件与copy 组合时,如果目标文件也是源文件之一,则可能会出现问题。当它是第一个源文件时,附加所有其他源文件的数据;当它不是第一个源文件时,可能会出现覆盖提示(除非您指定/Y)并且数据可能会丢失。既然你给了*.csv作为源文件,我们实际上并不知道先枚举哪个源文件,所以它可能是也可能不是all.csv。所以为了避免这样的麻烦,你最好在复制之前删除目标文件,而不是创建一个空文件,比如del all.csv

  3. 假设您有 Unicode 文件,它们以两个字节的标题 0xFF + 0xFE 开头。使用copy /B 组合此类文件时,文件中有多个此类标头。要克服这个问题,请在 cmd /U 发起的 Unicode cmd 实例中执行 copy /A

     cmd /U /C del all.csv ^& copy /A *.csv all.csv
    

【讨论】:

    【解决方案2】:
    copy /b *.csv all.txt & ren all.txt all.csv
    

    2>nul del all.csv & copy /b *.csv all.csv
    

    type 命令可以进行一些可能会干扰进程的更改。最好使用copy /b(带或不带for),但要确保生成的文件不存在或不被选中,以避免将其作为源包含在进程中。

    您还应该确保所有文件都具有相同的编码。如果其中一些是 Unicode/UTF-?有 BOM 有的没有,根据选择的第一个文件,您可能会以错误的格式数据结束。

    【讨论】:

    • 因为他已经在使用copy /b 并且在使用过的计算机上存在差异,我认为问题出在其他地方——即使我不知道在哪里。
    • @LotPings,不太确定(我稍后会测试),但是,echo. > all.csv 是否有可能干扰文件BOM?这导致,如果有些文件有 BOM 而有些没有,会发生什么?如果它不是 NTFS 分区(订单知道),第一个选择的文件是什么相关的? ...
    • 源文件具有所有相同的 BOM 设置 - 当然,它们来自相同的源并由相同的过程创建。这些是 AdWords 关键字规划师导出文件,以 csv 格式提供。 Notepad++ 将编码显示为UCS-2 Little Endian。是的,所有文件都放在 NTFS 上 - 但是不知道它们是在 Google 创建的。
    • @MCND 同意,他最好使用type NUL >all.csv 来保留文件,但将长度重置为零,而不会干扰来自 unicode 文件的可能 BOM(字节顺序标记),这些 BOM 必须是文件中的第一个字节文件。
    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    相关资源
    最近更新 更多