javascript - 解析文件并创建符合特定条件的键值对
问题描述
我得到了三组不同的数据 - Where Who 和 When。结果文件的结构永远不会只改变里面的结果(数字等值),但布局将始终保持不变。
我正在尝试解析文件,因此当我上传文件并运行它时,fileReader
它会操纵设置的记录并使用文档中给出的记录。
目前,这是页面的视图:
这就是填充它并赋予它适当的颜色。
function drawRegionsMap() {
var data = google.visualization.arrayToDataTable([
['Country', 'Occurrences'],
['Germany', 55],
['United States', 328],
['Brazil', 119],
['United Kingdom', 39],
['Italy', 39],
['Canada', 40],
['greenland', 80]
]);
var options = {};
var chart = new google.visualization.GeoChart(document.getElementById('regions_div'));
chart.draw(data, options);
}
上面是函数,下面我将提供结果数据。
journalism.When
2000 --> 219
2003 --> 194
1998 --> 190
2001 --> 173
2004 --> 155
2002 --> 155
1995 --> 144
2008 --> 127
1997 --> 123
1994 --> 117
journalism.Who
Atmos --> 85
J. Geophys --> 77
OECD --> 70
Grossman --> 56
EPA --> 54
PBL --> 49
Krueger --> 45
Stern --> 43
Selden --> 42
Taylor --> 41
journalism.Where
US --> 129
São Paulo --> 115
Brazil --> 104
U.S. --> 76
Germany --> 55
USA --> 45
America --> 42
Italy --> 39
UK --> 39
LA --> 36
所以对于这个解析,我需要它忽略前两个部分,只读取底部部分是journalism. Where
.
解决这个问题的最佳方法是什么,我从来没有真正在解析数据方面做过很多工作。这一切都是用 VanillaJS 完成的。任何反馈或帮助将不胜感激。我对如何解决这个问题有一些想法,但我想在这里问一下,看看是否有人有真正好的技术。
解决方案
如果你的语法非常简单,它不需要任何高级的解析技术,你可以很容易地用split
和for
循环来解决这个问题。
您基本上可以拆分源字符串\n\n\n\n
以拆分每个键。然后,对于每个块,您可以将其拆分为另一个块,\n\n
这将为您提供数据行,您可以将第一项作为键名 [ journalist.who
, ...] 并遍历将它们拆分的其他行-->
并获取键和值拆分产生的第一项和第二项。
最终结果将类似于下面的函数:
function parseData(src) {
var blocks = src.split('\n\n\n\n');
var keys = {};
for (var i = 0; i < blocks.length; i++) {
var block = blocks[i].split('\n\n');
var label = block[0];
var key = keys[label] = {};
for (var j = 1; j < block.length; j++) {
var data = block[j].split(' --> ');
key[data[0]] = data[1];
}
}
return keys;
}
警告:如果您使用像行尾样式 [
\r\n
] 这样的窗口,则必须拆分\r\n
而不是,或者您可以像这样在解析之前\n
删除所有内容:\r
var src = `...`; src = src.replace(/\r/g, ''); var data = parseData(src);
下面是我描述的解决方案的一个工作片段。
var src = `journalism.When
2000 --> 219
2003 --> 194
1998 --> 190
2001 --> 173
2004 --> 155
2002 --> 155
1995 --> 144
2008 --> 127
1997 --> 123
1994 --> 117
journalism.Who
Atmos --> 85
J. Geophys --> 77
OECD --> 70
Grossman --> 56
EPA --> 54
PBL --> 49
Krueger --> 45
Stern --> 43
Selden --> 42
Taylor --> 41
journalism.Where
US --> 129
São Paulo --> 115
Brazil --> 104
U.S. --> 76
Germany --> 55
USA --> 45
America --> 42
Italy --> 39
UK --> 39
LA --> 36`;
function parseData(src) {
var blocks = src.split('\n\n\n\n');
var keys = {};
for (var i = 0; i < blocks.length; i++) {
var block = blocks[i].split('\n\n');
var label = block[0];
var key = keys[label] = {};
for (var j = 1; j < block.length; j++) {
var data = block[j].split(' --> ');
key[data[0]] = data[1];
}
}
return keys;
}
var data = parseData(src);
document.write(`<pre>${JSON.stringify(data, null, 2)}</pre>`);
推荐阅读
- google-cloud-platform - Cloud Scheduler 不尊重我的超时设置(编辑:与 CloudRun 无关)
- c# - 确定 IIS vdir 中的主 DLL
- mime-types - 由 Quarkus 提供的带有错误 Content-Type 标头的 Wasm 文件
- solr - 在空的 Solr 核心上重新索引
- c# - 当我在 C# 中提交表单时程序崩溃
- c++ - 使用 Ultralight 将 JavaScript 值从 UI 发送到 C++ 程序
- php - JSON_decode 与 file_get_contents,为什么不工作?
- awk - 来自服务器的错误 (NotFound): 未找到 pod "$(kubectl"
- java - 尽管在类中声明了方法,但java说“找不到符号”
- web-scraping - 使用 Jsoup 浏览使用函数而不是 url 的网页