3

次の形式のかなり大きなテキストファイル(16,000行以上)があります。

#ID     #Line Num       #Var Col Length Values (HEX):
45      00001           FFFF FFFF 0000 0000
45      00002           0000 0000 FFFF FFFF
47      00003           AAAA 1111 AAAA 1111 AAAA 1111
49      00004           BBBB 2222 

注:実際のファイルにはさらに多くのHEX値があるため、これは明らかにデータで構成されています。

Matlabではtextscan、1行のコマンドを使用してみました。

fp = fopen(filePath, 'rt');
readLine = fgetl(fp);
[ignored, pos] = textscan(readLine, '%d');
values = textscan(readLine(pos+1:end), '%x');

正しくフォーマットされていない文字列のエラーが発生します。textscan16進値の変換はサポートされていないと思います。私はここで見つけた解決策も試しました:

16進データをMATLABにロードする際の問題(バグ?)

しかし、それもうまくいかないようです。非常に長い時間がかかるため、各16進値を個別に変換することは避けようとしています(これは、現在実装しているソリューションです)。テキストファイルから可変列幅の16進値をスキャン/解析するにはどうすればよいですか?

4

2 に答える 2

3

代わりに使用できますsscanf

fp = fopen(filePath, 'rt');
readLine = fgetl(fp);
results = sscanf(readLine, '%x');

これにより、変換された16進値の列が10進数で表示されます。単一行の値が必要な場合は、単純に転置します。

results = results'

これは、最初の2つの項も16進値であることを前提としています。最初の2つの値をdoubleとして分離し、残りのhexを分離する必要がある場合は、次のようにします。

fp = fopen(filePath, 'rt');
readLine = fgetl(fp);
[ignored, pos] = textscan(readLine, '%d');
results = sscanf(readLine(pos+1:end), '%x');
于 2013-03-19T17:02:40.850 に答える
2

次のアプローチを使用して、テキストファイルを文字列のセル配列に読み込み、次を使用して個別の値に分割できますregexp

fp = fopen(filePath, 'rt');
C = textscan(fp, '%s', 'CommentStyle', '#', 'Delimiter', '');
C = regexp(C{:}, '\w+', 'match');
fclose(fp);

これにより、たとえば次のようなセル配列のセル配列が生成されます。

C =
    {'45'    '00001'    'FFFF'    'FFFF'    '0000'    '0000'}
    {'45'    '00002'    '0000'    '0000'    'FFFF'    'FFFF'}
    {'47'    '00003'    'AAAA'    '1111'    'AAAA'    '1111'    'AAAA'    '1111'}
    {'49'    '00004'    'BBBB'    '2222'}

結果のセル配列を好みに合わせて操作できます。たとえば、各行の最初の2列を破棄し、すべてを10進数に変換します。

result = cellfun(@(x)hex2dec(x(3:end)), C, 'UniformOutput', false)
于 2013-03-19T16:34:00.183 に答える