.frd文件是一种多列数字数据表,用于存储有关扬声器频率响应的信息。在文本编辑器中打开的.frd文件如下所示:
2210.4492 89.1 -157.7
2216.3086 88.99 -157.7
2222.168 88.88 -157.6
2228.0273 88.77 -157.4
使用javascript,有没有一种方法可以解析此数据以便分别返回每一列?
例如,从上面的.frd文件中,我需要像这样返回值:
var column1 = [2210.4492, 2216.3086, 2222.168, 2228.0273];
var column2 = [89.1, 88.99, 88.88, 88.77];
var column3 = [-157.7, -157.7, -157.6, -157.4];
我不确定要从哪里开始尝试实现这一目标,因此朝正确方向迈出的任何一步都是有帮助的!
答案 0 :(得分:0)
我找到了以下description的FRD文件格式,我将遵循它。
让我们假设您的.frd
文件的内容在名为content
的变量中(以下示例适用于Node.js):
const fs = require('fs');
const content = fs.readFileSync('./input.frd').toString();
现在,如果content
包含您的FRD数据,则表示它是一组线,每行包含正好三个数字:频率(Hz),电平(dB)和相位(度)。要将您的content
分成几行,我们可以按字面意思split
:
const lines = content.split(/\r?\n/);
(通常,只用'\n'
分割是可行的,但为了以防万一,让我们明确支持Windows风格的换行符\r\n
。/\r?\n/
是一个表示“也许\r
,然后\n
”)
要将每一行解析为三个数字,我们可以这样做:
const values = line.split(/\s+/);
如果文件可以包含空行,则可能需要仔细检查该行是否恰好具有三个值:
if (values.length !== 3) {
// skip this line
}
鉴于我们在values
中有三个值(作为字符串),我们可以分配相应的变量:
const [frequency, level, phase] = values.map(value => Number(value));
({.map
将values
中的所有值从字符串转换为Number
-我们执行此操作以确保存储正确的类型)。
现在将所有这些片段放在一起:
const fs = require('fs');
const content = fs.readFileSync('./input.frd').toString();
const frequencies = [];
const levels = [];
const phases = [];
const lines = content.split(/\r?\n/);
for (const line of lines) {
const values = line.split(/\s+/);
if (values.length !== 3) {
continue;
}
const [frequency, level, phase] = values.map(value => Number(value));
frequencies.push(frequency);
levels.push(level);
phases.push(phase);
}
console.log(frequencies);
console.log(levels);
console.log(phases);
如果需要的话,主要代码(与content
一起使用的代码)也将在浏览器中工作,而不仅仅是在Node.js中。
此代码可以用很多不同的方式编写,但我试图使其更容易解释,因此非常简单。
要在Node.js中使用它(如果您的JavaScript文件称为index.js
):
$ cat input.frd
2210.4492 89.1 -157.7
2216.3086 88.99 -157.7
2222.168 88.88 -157.6
2228.0273 88.77 -157.4
$ node index.js
[ 2210.4492, 2216.3086, 2222.168, 2228.0273 ]
[ 89.1, 88.99, 88.88, 88.77 ]
[ -157.7, -157.7, -157.6, -157.4 ]