从 CSV 中删除换行符以便正确导入 Excel

从 CSV 中删除换行符以便正确导入 Excel

因此,我创建了一个批处理脚本,将一些文本输出到 CSV。当我在记事本中打开 CSV 时,它看起来像这样,这正是我想要的。

173030,8,2793,2821244
173032,1,2793,2820692
173033,1,2793,2821120
173035,2,2793,2820788

但在 Excel 中显示为:

173030   8
2793
2821244

173032   1
2793
2820692

173033   1
2793
2821120

173035   2
2793
2820788

关键是有一些不需要的换行符。看来记事本只能识别 CRLF 换行符,但还有一些其他换行符要么是 CR 要么是 LF,Excel 可以识别,而记事本却不能。处理这个问题的最佳方法是什么?由于我已经通过批处理脚本创建了它,所以最好有一个批处理命令可以删除不需要的换行符。但如果可能有一个 excel 设置或我可以更改的东西,那也行得通。

答案1

如果您的示例准确,则您可能没有创建 Excel 真正能理解的内容。我建议尝试将包含标题的行作为第一行,看看是否有帮助。

另外,请检查行尾,确保您添加的是 \r\n(例如 Windows 行尾),而不仅仅是 \n - Excel 应该可以处理后者,但可能很难知道。

最后,确保您的批处理输出不包含虚假字符。例如,您确定数字没有前导或尾随字符(例如二进制代码 <32)吗?

更新:

好的,您共享的文件不是有效的 CSV。您必须删除奇数字符。我刚刚在 Brackets 文本编辑器中打开它,行在那里被拆分了。这就是 Excel 出现同样情况的原因。

例如,在第一行,数字 8 后面有 13 个空格,后跟一个回车符 (\n)

更新 2:清理输出的选项。以下是您可以根据自己的知识、背景和桌面允许的功能进行选择的几种可能性:

  • PowerShell - 您可以使用 PS 的功能相当轻松地清理数据并输出到有效的 CSV(PS 具有原生 CSV 功能)。当然,这可能意味着要学习 PS。
  • Node.JS - 我最喜欢的全平台工具!一个跨平台的 JavaScript 主机,可让您同时运行命令行和“服务器”进程。它具有良好的本机文件系统访问权限,并拥有大量库,几乎可以完成所有工作。如果您已经从 Web 开发中了解 JavaScript,或者想要尽量减少必须处理的语言数量,那么它非常适合您。您还可以使用 node-webkit 创建跨平台 UI,并借助 Node 的强大功能。
  • Windows Scripting Host - 也可以运行 JavaScript(至少 JScript 很接近)。如果必须,您也可以使用 VBScript。只要它没有被热心的管理员禁用,就可以从命令行运行。如果您需要 UI,您可以在 HTA 中使用相同的代码。
  • Google Refine - 一款非常有用的 ETL 工具,用于整理和转换数据。虽然有点过时了,而且很少更新,但还是有用的。免费。
  • Excel PowerQuery - Microsoft 的一款插件,只要 L 是 Excel,它对于 ETL 非常有用!我现在一直在使用它。免费,是 Microsoft BI 工具的一部分。

当然还有很多,这些只是举几个例子。

答案2

编辑控制行为是在 LF 上中断(与 RTF 和编程语言不同)。如果 LF 前面有一个 CR,则两者都会被删除。不过,除非您的代码不寻常,否则 CMD 会写出正确的行尾。

Set Arg = WScript.Arguments
set WshShell = createObject("Wscript.Shell")
Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
If LCase(Arg(1)) = "cr" then 
    Do Until Inp.AtEndOfStream
        Line=Inp.readline
        Line=Replace(Line, vbcr, "")
        Line=Replace(Line, vblf, "")
        outp.writeline Line
    Loop
End If
If LCase(Arg(1)) = "lf" then 
    Do Until Inp.AtEndOfStream
        Line=Inp.readline
        Line=Replace(Line, vbcr, vbcrlf)
        outp.writeline Line
    Loop
End If

使用

换行符

filter fix {lf|cr}

修复行尾问题。

不同的程序对行尾的处理方式不同。此外,记事本会插入一些奇怪的额外 CR 并将其忽略,但其他程序则不会。

行在换行符处中断。如果前面有回车符,则两个回车符都会被删除。但是,没有换行符的单个回车符不会中断行。

cr - removes all stray CR and LF left on each line.
lf - add a LF to any CR embeded in the middle of the line.

例子

修复 win.ini(不需要修复),并将其发送到屏幕

cscript //nologo filter.vbs fix cr < "%systemroot%\win.ini"

相关内容