1

リトルエンディアンでエンコードされ、var1の値が約250.000で、次にvar2の値が同じ数のバイナリファイルがあります。ファイルを読み取り、var1列とvar2列にそれらの値を持つDataSetを返すメソッドを作成する必要があります。

私はライブラリを使用しています:ここで何度も言及されているmiscutil、詳細についてはここも参照してください:.Net 4用のMiscUtilのアップデートはありますか?

利用可能にしてくれたJonSkeetに感謝します。:)

次のコードが機能しています。ファイルから読み取り、DataTableにデータを入力するためのforループを最小限に抑える方法に関するより良いアイデアに興味があります。なにか提案を?

private static DataSet parseBinaryFile(string filePath)
{
    var result = new DataSet();

    var table = result.Tables.Add("Data");

    table.Columns.Add("Index", typeof(int));
    table.Columns.Add("rain", typeof(float));
    table.Columns.Add("gnum", typeof(float));

    const int samplesCount = 259200; // 720 * 360

    float[] vRain = new float[samplesCount];
    float[] vStations = new float[samplesCount];

    try
    {
        if (string.IsNullOrWhiteSpace(filePath) || !File.Exists(filePath))
        {
            throw new ArgumentException(string.Format("Unable to open the file: '{0}'", filePath));
        }

        // at this point FilePath is valid and exists...
        using (FileStream fs = new FileStream(filePath, FileMode.Open))
        {
            // We are using the library found here: http://www.yoda.arachsys.com/csharp/miscutil/
            var reader = new MiscUtil.IO.EndianBinaryReader(MiscUtil.Conversion.LittleEndianBitConverter.Little, fs);

            int i = 0;

            while (reader.BaseStream.Position < reader.BaseStream.Length) //while (pos < length)
            {
                // Read Data

                float buffer = reader.ReadSingle();

                if (i < samplesCount)
                {
                    vRain[i] = buffer;
                }
                else
                {
                    vStations[i-samplesCount] = buffer;
                }

                ++i;
            }

            Console.WriteLine("number of reads was: {0}", (i/2).ToString("N0"));
        }

        for (int j = 0; j < samplesCount; ++j)
        {
            table.Rows.Add(new object[] { j + 1, vRain[j], vStations[j] });
        }
    }
    catch (Exception exc)
    {
        Debug.WriteLine(exc.Message);
    }

    return result;
} 
4

1 に答える 1

1

オプション1

ファイル全体をメモリ (またはメモリ マップ) に読み込み、1 回ループします。

オプション #2

var2 のプレースホルダー値を含む var1 セクションを読みながら、すべてのデータ テーブル行を追加します。次に、var2 セクションを読みながらデータ テーブルを修正します。

于 2012-06-19T22:37:19.130 に答える