【问题标题】:Javascript, parsing a CSV fileJavascript,解析 CSV 文件
【发布时间】:2016-09-16 11:18:23
【问题描述】:

问题:使用 Javascript 解析 CSV 文件客户端。

第一个问题是这是什么编码?下面是执行命令的结果:

cat file.csv | xxd

这里的文件不完整,你只看到标题行和第二行的开头。

0000000: 4500 2d00 6d00 6100 6900 6c00 2000 6100  E.-.m.a.i.l. .a.
0000010: 6400 7200 6500 7300 3b00 5200 6f00 6500  d.r.e.s.;.R.o.e.
0000020: 7000 6e00 6100 6100 6d00 3b00 4100 6300  p.n.a.a.m.;.A.c.
0000030: 6800 7400 6500 7200 6e00 6100 6100 6d00  h.t.e.r.n.a.a.m.
0000040: 3b00 4300 7200 6500 6400 6900 7400 6500  ;.C.r.e.d.i.t.e.
0000050: 7500 7200 6e00 7500 6d00 6d00 6500 7200  u.r.n.u.m.m.e.r.
0000060: 3b00 4700 6f00 6500 6400 6b00 6500 7500  ;.G.o.e.d.k.e.u.
0000070: 7200 6400 6500 7200 7300 3b00 4600 7500  r.d.e.r.s.;.F.u.
0000080: 6e00 6300 7400 6900 6500 3b00 4b00 6f00  n.c.t.i.e.;.K.o.
0000090: 7300 7400 6500 6e00 7000 6c00 6100 6100  s.t.e.n.p.l.a.a.
00000a0: 7400 7300 3b00 4200 6500 6800 6500 6500  t.s.;.B.e.h.e.e.
00000b0: 7200 6400 6500 7200 3b00 4400 6500 6300  r.d.e.r.;.D.e.c.
00000c0: 6c00 6100 7200 6100 6e00 7400 3b00 4700  l.a.r.a.n.t.;.G.
00000d0: 6f00 6500 6400 6b00 6500 7500 7200 6400  o.e.d.k.e.u.r.d.
00000e0: 6500 7200 3b00 4500 7800 7000 6f00 7200  e.r.;.E.x.p.o.r.
00000f0: 7400 6500 7500 7200 3b00 4700 6500 6100  t.e.u.r.;.G.e.a.
0000100: 6300 7400 6900 7600 6500 6500 7200 6400  c.t.i.v.e.e.r.d.
0000110: 3b00 5000 6500 7200 7300 6f00 6e00 6500  ;.P.e.r.s.o.n.e.
0000120: 6500 6c00 7300 6e00 7500 6d00 6d00 6500  e.l.s.n.u.m.m.e.
0000130: 7200 3b00 4700 6500 6200 7200 7500 6900  r.;.G.e.b.r.u.i.
0000140: 6b00 6500 7200 7300 6e00 6100 6100 6d00  k.e.r.s.n.a.a.m.
0000150: 3b00 5500 3300 2000 2000 2000 2000 2000  ;.U.3. . . . . .
0000160: 2000 2000 2000 2000 2000 2000 2000 2000   . . . . . . . .
0000170: 2000 2000 2000 2000 2000 2000 2000 2000   . . . . . . . .
0000180: 2000 2000 2000 2000 2000 2000 2000 2000   . . . . . . . .
0000190: 2000 2000 2000 2000 2000 2000 2000 2000   . . . . . . . .
00001a0: 2000 2000 2000 2000 2000 2000 2000 2000   . . . . . . . .
00001b0: 2000 2000 2000 2000 2000 2000 2000 2000   . . . . . . . .
00001c0: 2000 2000 2000 2000 2000 2000 2000 2000   . . . . . . . .
00001d0: 2000 2000 2000 2000 2000 2000 2000 2000   . . . . . . . .
00001e0: 2000 2000 2000 2000 2000 2000 2000 2000   . . . . . . . .
00001f0: 2000 2000 2000 2000 2000 2000 2000 0d00   . . . . . . ...
0000200: 0a00 4100 2e00 4a00 4100 4e00 5300 4500  ..A...J.A.N.S.E.

为了解析文件,我们希望能够遍历每一行。为此,我们使用以下正则表达式:

lines = str.match(/[^\r\n]+/g)

结果如下:

['...\u0000', '\u0000', '\u0000...']

但实际上应该是这样的:

['... ', 'A...']

如果文件不是问题,我可以使用什么正则表达式不让空字节“破坏”正则表达式。

编辑:

  • 执行file -I 返回application/octet-stream; charset=binary

【问题讨论】:

  • 我认为这是对 xxd 逗号的误用。通过快速的谷歌搜索,xxd 命令创建了文件的十六进制转储,这违背了将其格式化为 csv 的目的。尝试在不使用 xxd 的情况下通过解析器运行它。
  • 我只是使用了注释,以便您可以看到文件的确切内容,文件。
  • 编码可能是 UTF-16 (Little Endian) 或 UCS-2。
  • 您需要使用 UTF-16LE 解码器读取文件。您的环境是什么,我们在谈论 Node 应用程序吗?顺便说一句,上面的正则表达式不适合在 CSV 文件中分割行,因为它会匹配引用字段中的换行符。

标签: javascript regex csv unicode utf-8


【解决方案1】:

你真的需要自己写这个机制吗? 我发现this 回答了一个类似的问题,它引用了一个用于读取 csv 文件的 jQuery 插件。 (没有足够的代表发表评论,所以这是我的答案)

另外,由于编码似乎是 16 位宽,我不认为正则表达式是最好的方法。即使只有 8 位,处理二进制格式通常也非常困难,除非您确切知道输入的每个字节的含义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 2016-05-04
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    相关资源
    最近更新 更多