我有一个包含5.5mb经度纬度数据的JavaScript Object文件,我想在Perl中打开它,所以我可以应用粗略的细节减少算法,然后用减少的数据集保存新的目标文件。为了减少细节,我使用一个只需要每20个长/纬度对的for循环。
我可以在javascript中执行此操作,但这需要我复制/粘贴每个坐标集并一次一个地运行我的JavasSript。
然后我想也许我可以采取每组坐标并将它们放入SQL数据库中,但这似乎是一种粗略的方法。并且移动了很多数据。
我认为Perl是更好的选择之一,可以在服务器上完成所有操作。
我可以用以下方式打开文件:
#!/usr/bin/perl
# open file
open(FILE, "reduced_object_latlng.js") or die("Unable to open file");
# read file into an array
@data = <FILE>;
# close file
close(FILE);
# print file contents
foreach $line (@data)
{
print $line;
}
该对象遵循以下设计:
var paths = {
mayo: {
name: 'Mayo',
colour: 'green',
coordinates: '-9.854892,53.76898 -9.853634,53.769338 -9.85282,53.769387 -9.851981,53.769561 -9.850952,53.769508 -9.850129,53.769371 -9.849136,53.769171 **data**'
},
galway: {
name: 'Galway',
colour: 'purple',
coordinates: '**data**;
}
}; //etc.
为了说明我如何减少上述数据,我的javascript版本从一个var coords = "*data*"
coords = coords.split(" ");
var path = [];
var output="";
document.getElementById("map_canvas").innerHTML = "";
for (var i = 0; i < coords.length; i++) {
if (i%20==0)
{
var coord = coords[i].split(",");
output += coord[0]+","+coord[1]+" ";
}
}
document.getElementById("map_canvas").innerHTML = output;
我读过一些建议将其转换为JSON,我不确定是否需要这样做。而不是编写纯文本处理程序有没有办法将文件作为对象加载?
我被困了一段时间,所以我这样做了:
var outputobject = 'var paths = {';
for (property in copypaths) {
outputobject += property + ': { ';
outputobject += "name: '" + copypaths[property].name+"',";
outputobject += "colour: '"+ copypaths[property].colour+"',";
var reducedoutput="";
var coord = copypaths[property].coordinates.split(" ");
for (var i = 0; i < coord.length; i++) {
if (i%20==0)
{
var coords = coord[i].split(",");
reducedoutput += coords[0]+","+coords[1]+" ";
}
}
outputobject += "coordinates: '"+ reducedoutput+"'},";
}
outputobject += "};";
document.getElementById("reduced").innerHTML = outputobject;
它仍然涉及复制/粘贴并删除最后一个,
。
谢谢@Oleg V. Volkov,当我在本周晚些时候有更多时间的时候,我会看看你制定的方法。
答案 0 :(得分:3)
只需剥离领先的JavaScript,这样您就可以使用裸键获得几乎正确的JSON,并使用JSON
/JSON::PP
实例并将allow_barekey
设置为true值来解码生成的字符串。
答案 1 :(得分:1)
使用JSON
是最好的选择。它具有允许您解码不太严格的JSON语法的选项,您将需要
allow_singlequote
允许单引号和双引号字符串
allow_barekey
允许所有字母数字哈希键完全没有引号
decode_prefix
在数据结束后忽略垃圾
relaxed
祝你好运
下面的程序将JSON解码为Perl结构,提取mayo
条目的坐标字符串,并成对打印出值。
请注意,我删除了分号,并在coordinates: '**data**;
末尾添加了引号,因为我认为这是一个错误,而不是实际的JavaScript数据
use strict;
use warnings;
use JSON -support_by_pp;
my $json = JSON->new->relaxed->allow_singlequote->allow_barekey;
my $data = do {
local $/;
<DATA>;
};
my ($hash) = $json->decode_prefix($data =~ /(\{.*)/s);
my @coords = $hash->{mayo}{coordinates} =~ /[-0-9.]+/g;
printf "%f %f\n", splice @coords, 0, 2 while @coords;
__DATA__
var paths = {
mayo: {
name: 'Mayo',
colour: 'green',
coordinates: '-9.854892,53.76898 -9.853634,53.769338 -9.85282,53.769387 -9.851981,53.769561 -9.850952,53.769508 -9.850129,53.769371 -9.849136,53.769171 **data**'
},
galway: {
name: 'Galway',
colour: 'purple',
coordinates: '**data**'
}
}; //etc.
<强>输出强>
-9.854892 53.768980
-9.853634 53.769338
-9.852820 53.769387
-9.851981 53.769561
-9.850952 53.769508
-9.850129 53.769371
-9.849136 53.769171