如何使用 Javascript 解析 .frd 文件?
How can I parse a .frd file with Javascript?
.frd 文件是一种多列数字数据table,用于存储有关扬声器频率响应的信息。在文本编辑器中打开时,.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,有没有一种方法可以解析这些数据,以便 return 分别对每一列进行分析?
例如,从上面的 .frd 文件中,我需要 return 像这样的值:
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];
我不太确定从哪里开始尝试实现这一目标,因此朝正确方向迈出的任何一步都会有所帮助!
我找到了下面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-style 换行符 \r\n
以防万一。/\r?\n/
是常规表示 "maybe \r
, then \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 ]
.frd 文件是一种多列数字数据table,用于存储有关扬声器频率响应的信息。在文本编辑器中打开时,.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,有没有一种方法可以解析这些数据,以便 return 分别对每一列进行分析?
例如,从上面的 .frd 文件中,我需要 return 像这样的值:
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];
我不太确定从哪里开始尝试实现这一目标,因此朝正确方向迈出的任何一步都会有所帮助!
我找到了下面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-style 换行符 \r\n
以防万一。/\r?\n/
是常规表示 "maybe \r
, then \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 ]