【问题标题】:How can I parse a .frd file with Javascript?如何使用 Javascript 解析 .frd 文件?
【发布时间】:2019-07-16 02:59:49
【问题描述】:

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

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

【问题讨论】:

  • 您应该研究regular expression(regex) 的技术,这里有一个regex,它可能适合您的需求,也可能不适合您的需求([^ ]+) +([^ ]+) +([^ ]+)\n,但我认为在您学习正则表达式之后,您会发现最好的语法满足您的需求,干杯!
  • 您可以使用jsregex.com 之类的网站并将([^ ]+) +([^ ]+) +([^ ]+)\n 粘贴到正则表达式,将您的文本粘贴到Text,然后将$1 | $2 | $3 粘贴到替换。最后,点击replaceglobal单选按钮

标签: javascript node.js parsing frequency


【解决方案1】:

我找到了FRD文件格式的以下description,我会照着做的。

假设您的.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 ]

【讨论】:

  • 我向你致敬。这正是我一直在寻找的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 2020-05-07
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
相关资源
最近更新 更多