MATLAB處理Excel文件提升篇

2021-03-02 模擬在線
說明:下面所寫不代表技術深度,只是個人經驗之談。如有問題,希望路過本文的人能夠給我留言或者發郵件跟我交流。如果發現錯誤也請及時指正,我將十分感激!

想說一下我自己MATLAB M語言使用的進展階段。最初使用的時候只是當做一個超級計算器使用,那是在大學的時候。後來工作中用到文件處理,慢慢就開始變成了腳本。而我理解的腳本含義就是毫無拘束,隨便堆砌的一堆命令或者語句組合成的文件。如此一描述就知道它的特點了:寫起來簡單,因為在語法規則之外幾乎是沒有限制的;再就是確實是說不上什麼結構,更不用談什麼架構。

雖然這個寫起來的確是簡單,不需要多麼強的算法設計功底也不需要多麼寬廣的知識面,但是說到這種文件的維護那的確是一個噩夢。如果你一直在自己的圈子裡那還是很好的,畢竟自己對自己寫了一些什麼還是很有了解的。但是倘若到了維護別人的腳本的時刻,有時候看了一半自己的決定通常是重寫。重寫也比修改要來得乾脆,來得簡單。

然而,說起來這倒不是M語言的缺陷。而是M語言本身優秀的同時又賦予了我們一定的自由度。不幸的是我們很多人讓自由泛濫,最終的局面確實是變得有點不可控。我思考過為什麼過去我自己工作那麼忙,其實很多程度上就是這種方案或者思考的方式採用了拿來主義。不巧的是我的拿來主義所取的對象並不是一個很完美的對象,倘若我取的是某個軟體大師的方式,或許現在的我不該是這個樣子。而我自己在過去幾個月總結出來的晉級方式應該是這樣子的:命令à腳本à函數à面向對象。函數能夠構建我們思考問題的方式,模塊化我們的處理過程。而面向對象確實是能夠讓我們的東西在很大程度上得到了重用,而這一方面我做的明顯不夠好。

說的有些遠了,談一下這次晉級的主題——函數化

函數化也能夠在一定程度上讓我們的代碼得到重用,至少是要比腳本好很多。而這種街口化的方式也適合模塊化的作戰,也能滿足多人的協同。在MATLAB中有一點尤其讓我覺得函數化很有必要——函數化過程中的變量全都可以理解為局部量或者靜態量,也就是說它們不會被引入到數據空間。這樣前面的處理過程跟後面的處理過程除了接口之外其他部分互不影響,能夠簡化調試複雜度,也能夠讓功能更加穩健。而做到這一切,唯一需要花一點點精力的就是函數的寫法。其實,我覺得這比C或者Java簡單的多。

函數的定義方式如下:

function [out1, out2, ...] = myfun(in1, in2, ...),其中參數都是可選的。

我覺得有一些通用的函數我們可以只寫一次,做成函數以後只是調用就可以了。倘若是寫成腳本,這些東西做起來基本上就只能夠靠複製粘貼了。下面舉個簡單的例子,在處理Excel中一般如何使用函數。

下面來完成一個簡單的Excel文件格式轉換功能,目的是把07版以後的Excel文件轉換成03版以及之前的兼容格式。也就是說xlsx擴展名轉換成xls擴展名。這當然不是簡單改個擴展名就能夠實現的,這涉及到文件中的數據格式。我經常使用這個功能,我也用其他的方式實現了這個功能(不用盜版因此工作之餘沒有這麼多的軟體可以用,只能是用Perl或者Python等)。不過,MATLAB下實現的確是簡單很多,因為寫入數據的時候所有的數據轉換都是由Excel完成的,而這也是做這個數據轉換最穩妥的一個方式。轉換成03版之前的版本有個好處,那意味著你將可以使用其他免費軟體中的擴展庫來處理Excel,那個也會有意思的多。

功能設計將會很簡單,把Excel的內容讀出來讓後再重命名寫回到新的文件。一切結束之後,把原來的文件刪除。

>> ls

. Copy_of_data.xlsx xlsx2xls.m

.. data.xlsx

通過ls命令列出當前目錄下的所有文件,其中data.xlsx是將要處理的文件,Copy_of_data.xlsx是備份的文件,xlsx2xls.m是這次寫的程序。

程序代碼如下:

function xlsx2xls(excel_file)

% This function can be used to convert a 2007+ version format excel file

% to a 97-03 version file. You can use this function by passing a excel

% file name with a string format to it.

% 2015.11.22 First written by Grey.

new_excel_file = strrep(excel_file,'.xlsx','.xls');

[~,sheet_names] = xlsfinfo(excel_file);

sheet_number = length(sheet_names);

for i = 1:sheet_number

sheet_name = char(sheet_names(1,i));

[~,~,raw_data] = xlsread(excel_file,sheet_name);

xlswrite(new_excel_file,raw_data,sheet_name);

end

delete(excel_file);

其中,第一行是函數的原型:此函數有一個傳入參數,沒有輸出參數(正常設計的程序的時候我一般會加入參數,最起碼會有處理異常時候的部分「診斷」信息返回)。

程序的第一行是把文件名處理了一下,把xlsx替換成xls獲得了一個xls擴展名的文件名。這部分設計實際上有缺陷,因為文件名中本身也可能含有xlsx的字符串。比較好的方式是使用正則表達式,這裡僅作演示不做那種複雜化處理。

接下來,先是讀取了所有的Sheet頁的名字,然後以頁的方式向新的文件中寫入按頁讀取的原始數據。

最後一行是對文件源文件的刪除,最後只剩下「轉換」後的文件。

在命令窗口輸入xlsx2xls('data.xlsx');命令,很快處理結束。獲得了一個97-03格式的Excel文件。

幾點說明:

1,這個函數跟腳本就不一樣了,你只需要給別人這個接口,以及函數文件別人就可以直接調用你的文件而不必關心你寫了什麼。更不需要關心你們兩個的腳本之間是否有重複的變量名。

2,第二行開始的注釋最好是寫成有關本函數設計的介紹或者函數接口調用方式,這樣別人使用這個函數文件時候只要是原始碼就能夠直接使用help命令查看你的功能介紹。比如,在命令窗口輸入help xlsx3xls顯示如下結果:

>> help xlsx2xls

This function can be used to convert a 2007+ version format excel file

to a 97-03 version file. You can use this function by passing a excel

file name with a string format to it.

自己的版本信息等內容可以空一行,以注釋的形式寫在下面。

3, 再次說明,這只是一個簡單的演示,距離實用還是有很大的改進空間(比如圖片,比如格式,比如排版等處理)。

4, MATLAB在識別函數的時候其實首先識別的是文件名,所以,函數名跟文件名得寫成一致。

5, 這不是腳本,確實是不能直接運行,在調用的時候會實現相應的功能。

6,代碼中沒有任何clear以及clc的命令,但是你會發現數據空間中沒有變量運行的痕跡留下。這就是函數化的一大好處的體驗,彼此的運行空間似乎是獨立的,腳本中的信息也不會受此影響。

7,如果考慮到設計較為完美的程序,這裡面還需要加入各種異常的處理。這是我學習Python的時候學到的一種編程哲學,我覺得確實是很有必要。我們考慮的設計,不應該局限於當前,確實是應該擴展眼界看到很久以後。

資訊 · 共享 · 互助

模擬仿真的服務型媒體

微信號:sim_ol

相關焦點

  • 如何通過Matlab做學習界面
    如何做GUI界面做GUI界面的方式有兩種:一種是通過matlab新建一個Graphical User Interface(GUI),這種方式建立的GUI會有兩個文件,分別是.fig文件和.m文件,二者缺一不可。這種建GUI的方式比較常見,網上也有各種教程,這裡不再詳細介紹。
  • 深入淺出MATLAB數據處理之文件讀寫
    這些參數都很關鍵,其實主要涉及到跨平臺操作的問題,python或者其它編譯軟體處理的文件現在matlab需要處理,那麼就必須字節順序、編譯方式要一致,不然自然得不到我們想要的結果。Fopen函數講完了,現在講講fwrite函數fwrite(fileID,A,precision,skip,machinefmt) %該命令還指定將字節或位寫入文件的順序fileID:要寫入內容的文件A:待寫入文件中內容Skip:在寫入每個值之前跳過skip指定的字節或位數
  • Matlab高速列車,準備好上車了麼
    為什麼要學習用matlab或者python處理數據和做學術相關的工作?1. 不用進illustrator或者coredraw改圖了!2.你們打開一個超大的excel處理數據不卡麼?翻數據累不累?作圖選點很爽吧!4. 因為.超酷啊!5. …太多了 第一篇試水的文章,大家覺得有用或者可以學到東西就行! 今天來講matlab的最最最基本數據導入和基本的散點圖。為什麼直接開始數據導入?
  • 【校園雜工】Python腳本處理檔案圖片之完結篇:Python處理Excel
    這是一個系列的文章,這是第三篇,前兩篇的連結如下:【校園雜工】Python腳本處理檔案圖片之一【校園雜工】Python腳本處理檔案圖片之二任務描述給定一個文件夾,其中有大量圖片(沒有子文件夾)需要做的是:圖片處理在前面兩篇文章裡,我們已經學習了用內置庫 os提供的方法遍歷該文件夾下所有的圖片,並利用 pillow模塊提供的類和方法得到所有圖片的縮略圖
  • (實用篇)PHPExcel讀取Excel文件的實現代碼
    以下是文章分享1群,由於群人數已超過100,不能掃碼進群,這個任務呢,就由小篇來拉你們進群了,掃描下面二維碼,加小篇好友~用PHPExcel讀取Excel 2007 或者Excel2003文件,需要的朋友,可以參考下。
  • Python利用openpyxl處理excel文件(openpyxl的安裝及簡介)
    但是試想,如果把上述excel公式變成諸如python中的if-else結構,其可讀性肯定是不容置疑的……今天,我們來介紹一款excel處理利器—openpyxl(python庫文件)。根據openpyxl官方文檔,結合個人近年來使用心得,總結openpyxl應用中以下幾個知識點:(一)openpyxl的安裝、導入及相關注意事項;(二)對excel文件的打開、讀寫、編輯、保存相關;(三)對excel文件中樣式的編輯;
  • Matlab教程 | 利用NC文件進行相關係數場的計算及繪製
    inpath = 'H:\NC文件.nc'; %NC文件位置inpath2 = 'H:\excel文件.xlsx';     %SSN指數文件位置,excel格式,記得只包含數據inpath3 = 'H:\圖片輸出位置';        %圖片儲存位置varname = 'NC文件的變量名';         %NC文件的變量名title_plot = 'XX-XX相關';          %
  • 利用excel和批處理(.bat)批量創建文件夾
    生活、工作中我們會遇到某種特定的情況,需要創建多個文件或文件夾如果一個個的創建是一個很麻煩的事,像很多部門的歸檔文件都是以日期為單位保存的,那如果說以第一天的單位建一個文件或文件夾首先新建一個文本文件(*.txt文件)把txt文件後綴也就是.txt改戊.bat,這是把文本文件改成批處理文件!
  • 一文帶你輕鬆搞定matlab各種數據讀寫
    日常在MATLAB編程愛好者討論群中經常有人求助讀取文件的方法,本期過冷水就用最簡潔話語給出圖片、excel、文檔、音頻等類型的文件的讀取和儲存,廢話不多直接看代碼。1、讀取圖片本圖來源於matlab官方twitter圖片的名字是:matlab.jpg;儲存的絕對路徑是:C:\Users\wayne\Desktop讀取&儲存代碼:2、存儲&讀取excel中的數據
  • matlab vs R
    matlab 的程序文件分為腳本文件和函數文件,你可以在命令行窗口直接鍵入腳本文件名便可以運行整個文件,得到輸出結果,但 R 並不能這樣做,它需要 source() 函數運行,其中的參數為完整的文件名 + 後綴名。
  • 詳解Python操作Excel文件
    前言本篇文章主要總結了一下利用python操作Excel文件的第三方庫和方法。常見庫簡介1.xlrdxlrd是一個從Excel文件讀取數據和格式化信息的庫,支持.xls以及.xlsx文件。地址:http://xlrd.readthedocs.io/en/latest/2.xlwtxlwt是一個用於將數據和格式化信息寫入舊Excel文件的庫(如.xls)。地址:https://xlwt.readthedocs.io/en/latest/3.xlutilsxlutils是一個處理Excel文件的庫,依賴於xlrd和xlwt。
  • 如何用Matlab/Python/Stata做簡單回歸分析
    Rc=1-(e'*e)/((Y-mean(Y))'*(Y-mean(Y))) %adjusted R-squared: Ra=1-((1/(N-k))*(e'*e))/((1/(N-1))*(Y-mean(Y))'*(Y-mean(Y))) Matlab導入文件的格式是
  • excel數據處理技巧:提取文件名的方法匯總
    前段時間我們和大家分享了使用BAT命令提取文件名稱的方法,不少小夥伴都被這個命令給驚豔到了。其實,提取文件名稱的方法遠不止這一種,甚至還有比BAT命令更簡單的方法,趕緊來看看吧!學習更多技巧,請收藏部落窩教育excel圖文教程。
  • 英文裡,求你不要把word文件叫word,excel文件叫excel, ppt文件叫ppt
    在中文裡習慣裡,把WORD文件叫WORD,EXCEL文件叫EXCEL,PPT文件叫PPT很正常。把這個WORD列印出來。我今天有十幾個EXCEL要發。你這個PPT做得專業喔。但英語裡,你可千萬別這樣說。
  • Matlab入門基礎知識(6)-數據文件的讀寫
    讀入數據文件時,應注意將該數據文件放入MATLAB可識別的路徑中。一般文件的存放路徑上不能出現中文字符,如上圖所示,黑色字體的文件即為可識別的路徑,而灰色字體的文件為未識別的路徑。滑鼠右鍵點擊未識別的文件,選擇添加進入「添加進路徑」,再選擇「選定的文件夾及子文件」,即可將該文件夾路徑更改為MATLAB的可識別路徑。
  • Python利用openpyxl處理Excel文件(Excel文件基本操作)
    上一篇,我們簡要介紹了openpyxl及其安裝過程,這一篇我們學習使用openpyxl處理Excel的具體過程,力爭涵蓋大多數官方文檔中相關內容,對這一知識點進行簡單的匯總。一、學習目標(一)openpyxl的具體使用。
  • 【午夜搞科研】matlab之讀寫asc文件小技巧
    最近剛考完六級,學習之心日漸衰落室友看到我如此頹廢於是給我找了個活,讓我幫他處理一些數據
  • matlab處理圖像代碼
    1、圖像的讀取MATLAB中從圖像文件中讀取數據用函數imread(),這個函數的作用就是將圖像文件的數據讀入矩陣中,此外還可以用
  • Python 數據處理(十九)—— Excel
    Python 數據處理(十九)Excel 文件read_excel() 方法可以使用 openpyxl 模塊讀取 Excel 2007+(.xlsx)文件可以使用 xlrd 讀取 Excel 2003(.xls)文件。
  • 利用pandas讀取格式不規範的Excel文件
    介紹pandas 很容易將Excel文件讀取為DataFrame,但是在現實中,Excel文件裡面的數據格式往往是不規範的