【问题标题】:Reading text file with special characters using d3.request使用 d3.request 读取带有特殊字符的文本文件
【发布时间】:2017-12-26 21:04:15
【问题描述】:

我有一个file.txt,我需要访问我的脚本并通过 d3.request 进行解析。

文件内容采用 windows-1250 编码,有多余的行要删除,所以只有以 'Date' 和 '2017' 开头的行应该通过。

到目前为止,我一直在使用 cli 解决方案来 grep 文本文件(删除多余的行)并使用 d3 dsv2json 来获取可以加载的干净 json。

$ grep -E '^(Date|2017)' file.txt > file.csv

$ dsv2json -r ';' --input-encoding windows-1250 --output-encoding utf-8 < file.csv > file.json

但是现在我需要通过 d3.request 在脚本中加载 txt 文件后以编程方式执行这些操作。

d3.request('file.txt')
  .mimeType('text/csv')
  .response(function(response) {
    // response.responseText
})

responseText 给我的原始数据有错误的编码和额外的行。如何修复它以使其最终生成干净的 json?

【问题讨论】:

    标签: javascript json csv d3.js


    【解决方案1】:

    经过进一步调查,我找到了解决方案。

    为了解码文件,我使用了来自 here 的解决方案和 TextDecoder。为此,应将 d3.request.response 设置为 arraybuffer

    function decode(response) {
      const dataView = new DataView(response);
      const decoder = new TextDecoder("windows-1250");
      const decodedString = decoder.decode(dataView);
      return decodedString
    }
    

    为了过滤掉多余的行,我使用了以下步骤:

    function filterData(rawData) {
      return rawData
        .split(/\n/)
        .filter(row => (row.startsWith('Data') || row.startsWith('2017')))
        .join('\n')
    }
    

    最后,在 d3.request 的上下文中:

    d3.request('file.txt')
     .header('Content-Type', 'text/csv;charset=windows-1250')
     .mimeType('text/csv')
     .responseType('arraybuffer')
     .response(function(xhr) {
       const decoded = decode(xhr.response)
       const filtered = filterData(decoded)
       const json = d3.dsvFormat(';').parse(filtered)
       return json
      })
     .get()
    

    【讨论】:

      猜你喜欢
      • 2018-02-05
      • 2016-11-13
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多