如何在 JavaScript 中提取 TSV 文件中的信息并将其保存在数组中?

问题描述 投票:0回答:7

我遇到了一个问题。如果我只有 tsv 的文件名。我如何提取它的所有信息并将其保存在一个数组中,比如 X,其中 tsv 文件中的每一行都由一个数组表示,比如 y,其中 X 是 ys 的数组。

如果我不知道列名的标题,我该怎么做?

javascript multidimensional-array csv
7个回答
5
投票

您将需要使用 AJAX 或仅使用纯 XMLHttpRequest。

http://d3js.org/ 有一个内置的 tsv 阅读器,基本上可以完全满足您的需求。

语法是

d3.tsv("file.tsv", function(data) {
    // use data here
});

data
变量是具有键/值对的对象数组,其中文件中的第一行作为键读入。所以,例如

Number Awesomeness
1      5
2      3

会回来

[{"Number":1, "Awesomeness":5}, {"Number":2, "Awesomeness":3}]
.


2
投票
// get file contents, store in var str
var x = str.split('\n');
for (var i=0; i<x.length; i++) {
    y = x[i].split('\t');
    x[i] = y;
}

console.debug(x);

有关如何获取文件内容的帮助,您需要指定这些文件的位置(在客户端计算机、服务器等上)。

如果文件位于客户端计算机上,您的前面可能有一条崎岖的道路。

如果文件位于服务器上,您需要执行 AJAX 请求以获取文件内容。


1
投票

把这个贴在这里,这样我下次需要的时候可以找到它:

// parse_tsv(tsvstring, function (row) { do something with row })
function parse_tsv(s, f) {
  var ix_end = 0;
  for (var ix=0; ix<s.length; ix=ix_end+1) {
    ix_end = s.indexOf('\n', ix);
    if (ix_end == -1) {
      ix_end = s.length;
    }
    var row = s.substring(ix, ix_end-1).split('\t');
    f(row);
  }
}

它比接受的答案更好,因为它不强制在内存中构建一个行数组,而是一个接一个地构建小数组。在具有大 TSV 的情况下,这会很有帮助。当然,如果您需要的话,您仍然可以使用回调构建数组。


0
投票

您不必为此使用 D3、JQuery 或任何其他框架。简单明了的 JavaScript(AJAX 技术):

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
        if (xhttp.readyState == 4 && xhttp.status == 200) {
                var arrayWithValues = xhttp.responseText.trim().split('\t');
                console.log(arrayWithValues);
        };
};
xhttp.open("GET", "/some.tsv", true);
xhttp.send();

0
投票

警告 不要自己创建它,或者一定要考虑到所有例外情况。

打字稿代码

import parser from "csvtojson";

/**
 * - Takes into account \t and \n inside cells
 * - Remove empty columns
 * - Remove empty rows
 * - Trim cells
 */
export async function parseSheetStringInJSON(
  tsvString: string
): Promise<Record<string, string>[]> {
  function removeEmpty(obj: Object) {
    return Object.fromEntries(
      Object.entries(obj).filter(([_, v]) => Boolean(v))
    );
  }

  const parsed: Record<string, string>[] = await new Promise(
    (resolve, reject) =>
      parser({
        flatKeys: true,
        delimiter: "\t",
        trim: true,
      })
        .fromString(tsvString ?? "")
        .then(function (result) {
          const clean = result.map((el) => removeEmpty(el));
          resolve(clean);
        })
  );

  return parsed;
}

const tsvString = prompt("Please") ??
  'Key 1\tKey 2\n1.1\t"2.1\n2.11"\n1.2\t2.2\n"1.3\t1.33"\t3.3';

parseSheetStringInJSON(tsvString).then(console.log)

-2
投票
$result = array();
$fp = fopen('/path/to/file','r');
if (($headers = fgetcsv($fp, 0, "\t")) !== FALSE)
  if ($headers)
    while (($line = fgetcsv($fp, 0, "\t")) !== FALSE) 
      if ($line)
        if (sizeof($line)==sizeof($headers))
          $result[] = array_combine($headers,$line);
fclose($fp);
print_r($result);

-2
投票

您可以使用 Alasql 库:

alasql('SELECT MATRIX * FROM TSV("mydata.tsv")',[],function(res){
    console.log(res);
});
© www.soinside.com 2019 - 2024. All rights reserved.