使用文本文件txt進行數(shù)據(jù)存取的技巧總結(jié)相當_第1頁
使用文本文件txt進行數(shù)據(jù)存取的技巧總結(jié)相當_第2頁
使用文本文件txt進行數(shù)據(jù)存取的技巧總結(jié)相當_第3頁
使用文本文件txt進行數(shù)據(jù)存取的技巧總結(jié)相當_第4頁
使用文本文件txt進行數(shù)據(jù)存取的技巧總結(jié)相當_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、使用文本文件 txt 進行數(shù)據(jù)存取的技巧總結(jié) 相當使用文本文件(.txt)進行數(shù)據(jù)存取的技巧總結(jié)由于本帖內(nèi)容較多,部分轉(zhuǎn)自他人的心得,因此,凡轉(zhuǎn)貼的地方僅用-轉(zhuǎn)-標注,原作者略去,在此對所有原作者表示感謝!特別說明:由于大家在I/O存取上以txt文件為主,且讀取比存儲更麻煩(存儲的話fwrite,fprintf基本夠用),因此下面的討論主要集中在txt文件的讀取上。除了標注了轉(zhuǎn)之外,其余心得均出于本人經(jīng)驗之結(jié)果,歡迎大家指正、補充。一.基本知識:-轉(zhuǎn)-1.二進制文件與文本文件的區(qū)別:將文件看作是由一個一個字節(jié)(byte)組成的,那么文本文件中的每個字節(jié)的最高位都是0,也就是說文本文件使用了一個

2、字節(jié)中的七位來表示所有的信息,而二進制文件則是將字節(jié)中的所有位都用上了。這就是兩者的區(qū)別;接著,第二個問題就是文件按照文本方式或者二進制方式打開,兩者會有什么不同呢?其實不管是二進制文件也好,還是文本文件也好,都是一連串的0和1,但是打開方式不同,對于這些0和1的處理也就不同。如果按照文本方式打開,在打開的時候會進行translate,將每個字節(jié)轉(zhuǎn)換成ASCII碼,而以按照二進制方式打開的話,則不會進行任何的translate;最后就是文本文件和二進制文件在編輯的時候,使用的方式也是不同的。譬如,你在記事本中進行文本編輯的時候,你進行編輯的最小單位是字節(jié)(byte);而對二進制文件進行編輯的話

3、,最小單位則是位(bit),當然我們都不會直接通過手工的方式對二進制文件進行編輯了。從文件編碼的方式來看,文件可分為ASCII碼文件和二進制碼文件兩種:ASCII文件也稱為文本文件,這種文件在磁盤中存放時每個字符對應一個字節(jié),用于存放對應的ASCII碼。例如,數(shù)5678的存儲形式為:ASCII碼:00110101 00110110 00110111 00111000十進制碼:5 67 8共占用4個字節(jié)。ASCII碼文件可在屏幕上按字符顯示,例如源程序文件就是ASCII文件,用DOS命令TYPE可顯示文件的內(nèi)容。由于是按字符顯示,因此能讀懂文件內(nèi)容。二進制文件是按二進制的編碼方式來存放文件的。例

4、如,數(shù)5678的存儲形式為:00010110 00101110只占二個字節(jié)。二進制文件雖然也可在屏幕上顯示,但其內(nèi)容無法讀懂。C系統(tǒng)在處理這些文件時,并不區(qū)分類型,都看成是字符流,按字節(jié)進行處理。輸入輸出字符流的開始和結(jié)束只由程序控制而不受物理符號(如回車符)的控制。因此也把這種文件稱作流式文件。2.文本模式(textmode)和二進制模式(binarymode)有什么區(qū)別?流可以分為兩種類型:文本流和二進制流。文本流是解釋性的,最長可達255個字符,其中回車/換行將被轉(zhuǎn)換為換行符n,(如果以文本方式打開一個文件,那么在讀字符的時候,系統(tǒng)會把所有的rn序列轉(zhuǎn)成n,在寫入時把n轉(zhuǎn)成rn)。二進制

5、流是非解釋性的,一次處理一個字符,并且不轉(zhuǎn)換字符。注:n一般會操作系統(tǒng)被翻譯成行的結(jié)束,即LF(Line-Feed)r會被翻譯成回車,即CR(Cariage-Return)對于文本文件的新行,在UNIX上,一般用n(LF)來表示,Mac上用r(CR)來表示,Windows上是用nr(CR-LF)來表示。通常,文本流用來讀寫標準的文本文件,或者將字符輸出到屏幕或打印機,或者接受鍵盤的輸入;而二進制流用來讀寫二進制文件(例如圖形或字處理文檔),或者讀取鼠標輸入,或者讀寫調(diào)制解調(diào)器。如果用文本方式打開二進制文件,會把0D 0A自動變換成n來存在內(nèi)存中。寫入的時候反向處理。而二進制方式打開的話,就不會

6、有這個過程。但是,Unicode/UTF/UCS格式的文件,必須用二進制方式打開和讀寫。-上述基礎其實大可以略過,簡言之,對用戶來說:在matlab中存儲成為二進制還是文本文件取決于fopen的方式,如果用wt,則存儲為文本文件,這樣用記事本打開就可以正常顯示了;如果用w則存儲為二進制文件,這樣用記事本打開會出現(xiàn)小黑方塊,要正常顯示的話,可以用寫字板或UltraEdit等工具打開。二.Matlab的I/O文件操作使用技巧和總結(jié):1.Matlab支持的I/O文件(對應取/存操作)類型:(所有文件I/O程序不需要特殊的工具箱)(注:從上表可以看到,matlab不支持doc格式的文檔存取(因為doc

7、文檔包含很多格式控制符),請改用txt或者dat格式)2.Matlab的I/O文件指南:以下是部分對應的中文譯文:-轉(zhuǎn)-本技術(shù)支持指南主要處理:ASCII,binary,and MAT files.要得到MATLAB中可用來讀寫各種文件格式的完全函數(shù)列表,可以鍵入以下命令:help iofun MATLAB中有兩種文件I/O程序:high level and low level.High level routines:包括現(xiàn)成的函數(shù),可以用來讀寫特殊格式的數(shù)據(jù),并且只需要少量的編程。Low level routines:可以更加靈活的完成相對特殊的任務,需要較多的額外編程。High level

8、 routines包括現(xiàn)成的函數(shù),可以用來讀寫特殊格式的數(shù)據(jù),并且只需要少量的編程。舉個例子,如果你有一個包含數(shù)值和字母的文本文件(text file)想導入MATLAB,你可以調(diào)用一些low level routines自己寫一個函數(shù),或者是簡單的用TEXTREAD函數(shù)。使用high level routines的關(guān)鍵是:文件必須是相似的(homogeneous),換句話說,文件必須有一致的格式。下面的段落描述一些high level routines并給出一些例子幫助理解概念。LOAD/SAVE主要的high level routines是LOAD和SAVE函數(shù)。LOAD可以讀MAT-或者

9、用空格間隔的格式相似的ASCII data.SAVE可以將MATLAB變量寫入MAT-file格式或者空格間隔的ASCII data。大多數(shù)情況下,語法相當簡單。下面的例子用到數(shù)值由空格間隔的ASCII :1 54 16 85 43 26 86 84 32 190 78 76 59 81 23 Example:用LOAD and SAVE讀寫數(shù)據(jù)CODE:%Load the the matrix,M:M=load(sample_)%Add 5to M:M=M+5%Save Mto a.mat sample_:save sample_ M%Save Mto an ASCII.txt sample

10、_:save sample_ M-ascii UIGET UIGET是基于圖形用戶界面(GUI)的。會彈出對話框,列出當前目錄的文件和目錄,提示你選擇一個文件。UIGETFILE讓你選擇一個文件來寫(類似Windows另存為選項?)。用UIGETFILE,可以選擇已存在的文件改寫,也可以輸入新的文件名。兩個函數(shù)的返回值是所選文件名和路徑。Example:用UIGETFILE從當前目錄選擇一個M-:%This command lists all the M-files in the current directory and%returns the name and path of the se

11、lected filefname,pname=uigetfile(*.m,Sample Dialog Box)注意:UIGETFILE一次只能選擇一個文件。UIIMPORT/IMPORTDATA UIIMPORT是一個功能強大,易于使用的基于GUI的high level routine,用于讀complex data files。文件也必須是homogeneous。IMPORTDATA形成UIIMPORT的功能,不打開GUI。可以將IMPORTDATA用于函數(shù)或者腳本中,因為在函數(shù)或者腳本中基于GUI的文件導入機制并不理想。下面的例子用到包含幾行文件頭和文本、數(shù)值數(shù)據(jù)的文件sample_:Th

12、is is a.This is an example.col1 col2 col3 col4 A1 4612.000 B1 4613.000 C1 4614.000 D1 4615.000 Example:Using IMPORTDATA to read in a headers,text,and numeric data CODE:%This reads in the and creates a%structure Dthat contains both data and text data.%Note the IMPORTDATA command specifies awhite spac

13、e%as the delimiter of the IMPORTDATA can usually%detect this on its own D=importdata(sample_,)%原文有誤?D=importdata(sample_)可以通過訪問結(jié)構(gòu)D的數(shù)據(jù)和文本域,來看結(jié)構(gòu)D中的真實值,例如輸入:data=D.data text=D.textdata可以用UIIMPORT讀同一個文件并得到同樣的結(jié)構(gòu).注意:對于ASCII data,你必須檢驗導入向?qū)д_的識別了列分隔符。TEXTREAD/STRREAD TEXTREAD是一個強大的動態(tài)high level routine,設計用來讀

14、ASCII格式的文本和/或數(shù)值數(shù)據(jù)文件。STRREAD除是從字符串而不是文件讀以外,類似于TEXTREAD。兩個函數(shù)可以用許多參數(shù)來改變其具體的工作方式,他們返回讀入指定輸出的數(shù)據(jù)。他們有效的提供給你一個兩全其美的方法,因為他們可以用一個命令讀入混合的ASCII和數(shù)值數(shù)據(jù)(high level routines的做法),并且你可以改變他們以匹配你特定的應用(如同low level routines做到的)。例子:CODE:Example 1:Using TEXTREAD to read in an entire acell array%This command reads in the int

15、o the cell array,(fft.m,%s,delimiter,n,whitespace,);CODE:Example 2:Using STRREAD to read the words in aline%This command uses the cell array created in Example 1to%read in each word of line 28 in acell array,words words=strread(,%s,delimiter,)CODE:Example 3:Using TEXTREAD to read in text and numeric

16、 data from a headers%This command skips the 2header lines at the top of the reads in each column to the 4specified outputsc1 c2 c3 c4=textread(sample_,%s%s%s%s,headerlines,2)CODE:Example 4:Using TEXTREAD to read in specific rows of text and numeric data from a command reads in rows Band Cof the head

17、erlines%property is used to move down to the desired starting row and the%read operation is performed 2timesc1 c2 c3 c4=textread(sample_,.%s%s%s%s,2,headerlines,4)CODE:Example 5:Using TEXTREAD to read in only the numeric data from a text and numbers%This command reads in only th enumeric data in the

18、 %headerlinesproperty is used to move down to the first row%of interest and the first column of text is ignored with the%*operatorc2 c3 c4=textread(sample_,%*s%d%d%f,headerlines,3)DLMREAD/DLMWRITE/CSVREAD DLMREAD和DLMWRITE函數(shù)能夠讀寫分隔的ASCII data,而不是用low level routines。他們比low level routines容易使用,Low level

19、routines用幾行代碼實現(xiàn)的功能可以用DLMREAD/DLMWRITE簡化成一行。CSVREAD用來讀分隔符是逗號的文件,是DLMREAD的特殊情況。當讀空格和Tab分隔的電子數(shù)據(jù)表文件時,DLMREAD特別有用。以sample_為例:CODE:Example 1:Using DLMREAD to read in a headers,text,and numeric data%This reads in the and creates amatrix,D,%with the numeric data this command specifies awhite space as the%de

20、limiter of the (sample_,)CODE:Example 2:Using DLMREAD to extract the first 3columns of the last 3rows%This reads in the first 3columns of the last 3rows of%the data into the matrix,D_partial.%讀文件sample_前3列后3行,到矩陣D_partial.D_partial=dlmread(sample_,2 04 2)CODE:Example 3:Using DLMWRITE to write acomma

21、 delimited creates apartialD.txtthat consists of%the first 3columns of the last 3rows of data where each%element is separated by acomma dlmwrite(partialD.txt,D_partial,)注意:保證DLMREAD and DLMWRITE指定范圍的指標從0開始,而不是從1開始。WK1READ/WK1WRITE WK1READ用來讀Lotus123電子數(shù)據(jù)表文件的數(shù)據(jù);WK1WRITE用來寫矩陣到Lotus123電子數(shù)據(jù)表文件。XLSREAD XL

22、SREAD用來讀Excel的數(shù)值和文本數(shù)據(jù)。-三.具體例子分析:Matlab網(wǎng)站用兩個例子非常詳盡地介紹了各個命令的基本用法,實際中,面對手頭上的數(shù)據(jù),如何選用合適的命令呢?以下結(jié)合幾個示例給出一些總結(jié),大家舉一反三就可以了:1.純數(shù)據(jù)(列數(shù)相同):源文件:CODE:0 3866.162 2198.938 141.140 13741.139 2208.475 141.252 23866.200 2198.936 141.156 33678.048 2199.191 141.230 43685.453 2213.726 141.261 53728.769 2212.433 141.277 637

23、38.785 2214.381 141.256 73728.759 2214.261 141.228 83748.886 2214.299 141.243 93748.935 2212.417 141.253 10 3733.612 2226.653 141.236 11 3733.583 2229.248 141.223 12 3729.229 2229.118 141.186解答:對于這個txt文件,由于各行列數(shù)相同,故簡單地使用load,importdata均可。2.字段名(中、英文字段均可)+數(shù)據(jù):源文件:CODE:CH0 CH1 CH2 CH3 0.000123 0.000325 0

24、.000378 0.000598 0.000986 0.000256 0.000245 0.000698解答:由于是記錄的形式,因此各行列數(shù)必相同(缺少部分列時請自行在文件中補上Inf或NaN),故直接使用importdata便可。3.注釋(含有獨立的數(shù)字串)+數(shù)據(jù)(列數(shù)相同):問題:這個文件有4列,但前6行是文字說明,4列數(shù)字是從第8行開始的.現(xiàn)在我想把這個文件的前2列和文字說明提出來組成一個新的dat文件源文件:CODE:Group 212.02.2006 Limei Samples of datas:50000 CH0 CH1 CH2 CH3 0.000123 0.000325 0.00

25、0378 0.000598 0.000986 0.000256 0.000245 0.000698目標文件:CODE:Group 212.02.2006 Limei Samples of datas:50000 CH0 CH1 0.000123 0.000325 0.000986 0.000256解答:由于注釋中含有獨立的數(shù)字串,且注釋部分沒有明顯的格式,這時候用importdata,load等高級命令直接讀取會失敗,用textread,dlmwrite等格式化命令也不太合適,因此只能使用低級命令進行讀取。(當然了,可以跳過注釋部分直接用高級命令讀取數(shù)據(jù),即:a bc d=textread(,

26、%f%f%f%f,headerlines,4);)。一個簡單的、非通用的包含注釋的讀取方法如下:-轉(zhuǎn)-CODE:clc;clear;fid=fopen(exp.txt,r);fid_n=fopen(ex.dat,w);whilefeof(fid)tline=fgetl(fid);ifisempty(tline)if double(tline(1)=48&double(tline(1)=57%數(shù)值開始a=strread(tline);a(3:4)=;fprintf(fid_n,%f%fn,a);clear a;elseif double(tline(1)=67%字母C開始b1,b2,b3,b4=

27、strread(tline,%s%s%s%s);b=b11,b21;fprintf(fid_n,%sn,b);clear bb1 b2 b3 b4;else fprintf(fid_n,%sn,tline);end else fprintf(fid_n,%sn,tline);end end fclose(fid);fclose(fid_n);-4.注釋(不含獨立的數(shù)字串)+數(shù)據(jù)(列數(shù)相同):源文件:CODE:你好abc歡迎來到我們振動論壇 111 111 1111 222 222 2222 333 333 3333 444 444 4444 555 555 5555

28、解答:直接用importdata便可注:有時候注釋中含有獨立的數(shù)字串也可以importdata成功,不過得到的結(jié)果有可能不正確,建議這時候使用第3種情形的讀取方式。5.注釋與數(shù)據(jù)混排:對此當然只能自己編程,舉例:源文件:CODE:1 11 111 1111你好2 22 222 2222歡迎來到3 33 333 3333振動論壇4 44 444 4444 555 555 5555解答:-轉(zhuǎn)-CODE:functiondata=distilldata(infile)%功能說明:%將保存數(shù)據(jù)的原始文件中的數(shù)值數(shù)據(jù)讀入到一個data變量中%使用說明:%infile-原始數(shù)

29、據(jù)文件名;%data=數(shù)據(jù)變量tmpfile=tmp2.mat;fidin=fopen(infile,r);%打開原始數(shù)據(jù)文件(.list)fidtmp=fopen(tmpfile,w);%創(chuàng)建保存數(shù)據(jù)文件(不含說明文字)whilefeof(fidin)%判斷是否為文件末尾tline=fgetl(fidin);%從文件讀入一行文本(不含回車鍵)ifisempty(tline)%判斷是否空行m,n=size(tline);flag=1;for i=1:n%判斷一行中有沒有字符(+-.Ee和空格鍵除外)if(tline(i)=|tline(i)=-|tline(i)=.|tline(i)=E.|t

30、line(i)=e|tline(i)=+.|(double(tline(i)=48&double(tline(i)=57)flag=0;break;end end if flag=1%如果是數(shù)字行,把此行數(shù)據(jù)寫入文件fprintf(fidtmp,%sn,tline);end end end fclose(fidin);fclose(fidtmp);data=textread(tmpfile);delete(tmpfile);-另外,如果要求不高,也可以使用textread函數(shù)跳過注釋部分進行讀取,不過前提是需要事先知道文件內(nèi)容的結(jié)構(gòu)(即哪行是數(shù)據(jù)、哪行是注釋)6.各列數(shù)據(jù)的分離:源文件:COD

31、E:0+47038.7 1.05 09:26:07 C2+46477.7 1.03 09:28:38 C4+44865.7 1.04 09:28:48 C6+41786.4 1.03 09:28:56 C8+39896.0 0.97 09:29:03 C10+37518.4 0.93 09:29:15 C12+35858.5 0.92 09:29:30 C14+46105.0 1.03 09:30:21 C16+46168.6 6.89 09:30:30 C18+48672.3 4.33 09:30:40 C20+49565.7 0.49 09:30:48 C22+49580.7 0.53 0

32、9:30:55 C24+49602.3 0.84 09:31:03 C26+49582.5 1.51 09:31:11 C28+49577.0 1.39 09:31:19 C30+49589.3 0.61 09:31:27 C32+49578.3 1.06 09:31:29 C34+49512.5 1.77 09:31:38 C解答:直接用a,b,c,d,e,f=textread(your,%d%c%f%f%s%c);便可四.注意事項:1.請在matlab中保持當前路徑在該數(shù)據(jù)文件對應的目錄下進行存取,否則,存取時請給出該數(shù)據(jù)文件的具體路徑。2.存取時,請給出該數(shù)據(jù)文件的全稱(包括后綴名,讀取

33、mat文件時可省略)3.load data.txt和A=load(data.txt)的區(qū)別請參閱精華貼:原創(chuàng)寫給學習matlab的新手們4.請根據(jù)讀寫需要來打開文件,即根據(jù)你的需要來指定fopen的permission屬性為讀或?qū)?。如果只用a進行寫入,就不能用fread讀取。此時應該寫完關(guān)閉文件,然后用r打開讀取,或者直接用a+進行同時讀寫操作。否則,會產(chǎn)生莫名其妙的問題!以下代碼是一個錯誤的例子:CODE:e.dat;fid=fopen(,a);if fid 0error(fopen error);end s=1 23 4;5 67 8;fwrite(fid,s,float32)dd ll=

34、fread(fid,inf,float32);%把t中的數(shù)據(jù)全部讀出,即s矩陣。fclose(fid);此時得到的dd,ll是錯誤且無意義的!五.其他相關(guān)問題:1.連續(xù)讀取多個文件的數(shù)據(jù),并存放在一個矩陣中:(1)首先是如何讀取文件名:方法一:(*.jpg);那么第i個文件的文件名就可以表示為(i).name文件數(shù)量為:length()方法二:先在Windows的MSDOS(命令行)中使用以下命令生成一個list.txt文件:dir pathfolder/on/b/s pathlist.txt舉例:dir d:test/on/b/s d:list.txt然后在matlab中使用:(s,%s);

35、把所有文件名讀取到list細胞矩陣中,最后對i便可得到各文件名。(2)然后是讀取文件名的數(shù)據(jù)并存儲:假設每個文件對應的數(shù)據(jù)是m*n的,則:CODE:k=length();Data=zeros(m,n,k);for ii=1:k Data(:,:,ii)=yourreadstyle(ii);%yourreadstyle是對應的文件讀取方式的函數(shù)end 2.連續(xù)讀取多個文件的數(shù)據(jù),并存放在多個矩陣(以文件名命名)中:假設每個文件對應的數(shù)據(jù)是m*n的,則以上述第二種文件名讀取方法為例:CODE:k=length();for ii=1:k D=yourreadstyle(ii);eval_r(Data

36、_,num2str(ii),=D;);end 3.文件名命名問題:文件名為abc00001,abc00002,.abc00009,abc00010,.abc00099,abc00100,.abc00879.準備把這些文件名給放到一個數(shù)組里面去。解答:CODE:a=cell(879,1);for k=1:879 ak=sprintf(%.5d,k);end 4.上述各種文件格式、類型自動識別問題:可以利用正則表達式來處理,使之通用性較強。例如使用以下代碼可以自動處理上面提到了例1到例5各種情形,不過由于存在自動判斷,對某些例子(如例1)效率自然要低一點,而對于另外的例子(如例3、例5)效率估計要高一點(少用了一個循環(huán))。CODE:functiondata=dis

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論