如何使用Javascript解析.frd文件?

时间:2019-07-16 02:59:49

标签: javascript node.js parsing frequency

.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];

我不确定要从哪里开始尝试实现这一目标,因此朝正确方向迈出的任何一步都是有帮助的!

1 个答案:

答案 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));

({.mapvalues中的所有值从字符串转换为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 ]