我遇到了一个问题。如果我只有 tsv 的文件名。我如何提取其所有信息并将其保存在一个数组中,比如 X,其中 tsv 文件中的每一行都由一个数组表示,比如 y,其中 X 是 ys 的数组。
如果我不知道列名的标题,我该怎么做?
我遇到了一个问题。如果我只有 tsv 的文件名。我如何提取其所有信息并将其保存在一个数组中,比如 X,其中 tsv 文件中的每一行都由一个数组表示,比如 y,其中 X 是 ys 的数组。
如果我不知道列名的标题,我该怎么做?
您将需要使用 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}]
。
// 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 请求以获取文件内容。
把它贴在这里,以便下次需要时可以找到它:
// 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 较大的情况下,这可能会有所帮助。当然,如果您需要,您仍然可以使用回调构建数组。
您不必为此使用 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();
您可以使用Alasql库来做到这一点:
alasql('SELECT MATRIX * FROM TSV("mydata.tsv")',[],function(res){
console.log(res);
});
$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);