2013-03-19 36 views
3

我有一個具有以下格式的相當大的文本文件(16000行):如何讀取matlab中具有可變十六進制值列的文本文件?

#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命令:

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

我得到一個錯誤格式串的錯誤。我假設textscan不支持十六進制值的轉換。我也試着在這裏找到了解決辦法:

Problem (bug?) loading hexadecimal data into MATLAB

但也似乎並沒有正常工作。我試圖避免單獨轉換每個十六進制值(有些是我現在實現的解決方案),因爲這需要很長時間才能完成。如何從文本文件中掃描/解析變量列寬十六進制值?

回答

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'} 

您可以根據自己的喜好來操作生成的單元格數組。舉例來說,丟棄每行的前兩列,一切都轉換爲十進制:

result = cellfun(@(x)hex2dec(x(3:end)), C, 'UniformOutput', false) 
+1

這真的很整齊有序。它不是逐行取出文件,而是處理整個文件並將其轉儲成一個組織良好的數據表單。我很害怕'hex2dec'的使用,因爲當我單獨調用它時(2M +次和136+秒),需要很長時間,但是這要快得多(小於1秒)! – KronoS

3

您可以使用sscanf代替:

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

這會給你十進制轉換十六進制值的列。如果你需要在一個單一行的值簡單地轉吧:

results = results' 

這假設前兩項也是十六進制值也是如此。如果您需要將前兩個值分隔爲兩個,然後其餘的十六進制執行以下操作:

fp = fopen(filePath, 'rt'); 
readLine = fgetl(fp); 
[ignored, pos] = textscan(readLine, '%d'); 
results = sscanf(readLine(pos+1:end), '%x'); 
相關問題