bugfix> javascript > 投稿

.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 件
  • 次のFRDファイル形式の説明を見つけたので、それに従います。

    .frd のコンテンツが  ファイルは content という変数にあります  (次の例はNode.js用です):

    const fs = require('fs');
    const content = fs.readFileSync('./input.frd').toString();
    
    

    今は content の場合  FRDデータがあり、それは一連のラインであることを意味します。各ラインには、周波数(Hz)、レベル(dB)、位相(度)の3つの数値が含まれています。 content を分割するには  行に、文字通り split することができます  それ:

    const lines = content.split(/\r?\n/);
    
    

    (通常、 '\n' だけで分割  うまくいきましたが、Windowsスタイルの改行を明示的にサポートしましょう \r\n  念のため。ザ・ /\r?\n/  「たぶん \r 」と言う正規表現です 、次に \n ")

    各行を3つの数値に解析するには、次のようにします。

    const values = line.split(/\s+/);
    
    

    ファイルに空の行を含めることができる場合、その行に正確に3つの値があることを再確認することは理にかなっています。

    if (values.length !== 3) {
      // skip this line
    }
    
    

    values に3つの値があることを考えます 、文字列として、対応する変数を割り当てることができます:

    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 ]
    
    

あなたの答え