作數據分析必須瞭解的獲取數據與清洗數據技巧


​點擊關注 異步圖書,置頂公衆號程序員

天天與你分享 IT好書 技術乾貨 職場知識正則表達式

​參與文末話題討論,每日贈送異步圖書算法

——異步小編數據庫

每一個數據科學家都須要處理存儲在磁盤中的數據,這些數據涉及的格式有ASCII文本、PDF、XML、JSON等。此外,數據還能夠存儲在數據庫表格中。在對數據進行分析以前,數據科學家首先要作的是從這些數據源獲取各類格式的數據,並對這些數據進行清洗,去除其中的噪聲。今天推薦的圖書是《Java數據科學指南》一書,並從中節選第一章內容,從本文中咱們將學習這些內容,即瞭解如何從不一樣數據源獲取各類格式的數據。​編程

​在這一過程當中,咱們將用到外部Java庫(Java歸檔文件,簡稱JAR文件),這些庫的使用不只限於本文,還貫穿於《Java數據科學指南》一書。這些庫由不一樣開發者或組織開發,方便了你們的使用。編寫代碼時,咱們會用到Eclipse IDE工具,它是Windows平臺下最好的集成開發環境,全書都會使用它。接下來,咱們將講解如何導入任意一個外部JAR文件,如下各個部分將指導你把外部JAR文件導入到項目中,跟隨步驟動手去作便可。數組

對於一個Eclipse項目,你能夠採用以下方法添加JAR文件:首先依次單擊「Project|Build Path|Configure Build Path」,在Libraries選項卡中,單擊「Add External JARs」,選擇你想添加到項目的外部JAR文件,如圖1-1所示。網絡

1.2 使用Java從分層目錄中提取全部文件名 

這部份內容(以及後面各部份內容)是爲那些想從複雜目錄結構中提取文件路徑與名稱的數據科學家準備的,以方便進一步進行後續分析。這裏的複雜目錄結構是指在一個根目錄下包含大量目錄與文件。數據結構

準備工做異步

開始以前,須要作以下準備工做。函數

1.建立複雜的目錄結構(目錄層數你本身決定)。

2.在其中一些目錄中建立文本文件,而在另外一些目錄中留空。

操做步驟

1.首先編寫一個static方法,即listFiles(File rootDir),它帶有一個File類型的參數,該參數能夠是根目錄或起始目錄。這個方法將返回一系列文件,這些文件存在於參數所指定的根目錄(以及其餘全部下級子目錄)中。

​2.而後,建立一個HashSet對象,用來包含文件信息。

​3.在建立好HashSet對象以後,要檢查參數指定的根目錄及其子目錄是否爲null。當爲null時,直接把HashSet對象返回便可,不須要進行進一步處理。

​4.接着,檢查根目錄中的每一個目錄(或文件),判斷它是文件仍是目錄。若是是文件,就把它添加到HashSet中;若是是一個目錄,就遞歸地調用本方法,並把當前目錄路徑與名稱傳遞給它。

​5.最後,把HashSet返回給該方法的調用者。

​listFiles(File rootDir)方法的完整代碼以下,包含執行該方法所須要的類與驅動方法。

​請注意,代碼中的HashSet用來存儲文件路徑與名稱。這意味着咱們不會有任何重複項,這是由於Java中的Set這種數據結構不包含重複項。

1.3 使用Apache Commons IO從多層目錄中提取全部文件名

你可使用前面一部分演示的操做步驟,採用遞歸方法把多層目錄中的文件名列出來。除此以外,咱們還有另一種更簡單、更方便的方法來完成它,那就是使用Apache Commons IO,而且只需編寫少許代碼便可。

準備工做

開始以前,須要作以下準備。

1.本部分會用到一個名稱爲Commons IO的Java庫,它來自於Apache基金會。全書中,咱們會使用Commons IO 2.5版本,請從Commons官網下載JAR文件。

2.在Eclipse中,把下載的JAR文件包含到你的項目中(做爲外部JAR文件)。

操做步驟

1.建立listFiles方法,它帶有一個參數,用來指定層級目錄的根目錄。

​2.建立一個文件對象,並把根目錄名傳遞給它。

​3.Apache Commons庫的FileUtils類中包含一個名稱爲listFiles()方法。使用這個方法提取全部文件名,而且把它們放入一個帶有<File>泛型的列表變量中。使用TrueFileFilter.INSTANCE來匹配全部目錄。

​4.咱們能夠像下面這樣把文件名顯示在標準輸出中。因爲咱們把文件名放入了一個列表之中,因此咱們能夠經過某種方法對這些文件中的數據進行進一步處理。

​5.關閉方法。

​完整代碼包括方法代碼、類代碼,以及驅動方法,以下所示:

​若是你想把帶有一些特定擴展名的文件列出來,還可使用Apache Commons庫中的listFiles方法。可是這個方法的參數有些不一樣,它擁有3個參數,分別爲文件目錄、擴展名(String[])、遞歸與否。在這個庫中還有一個有趣的方法,即listFilesAndDirs(File directory, IOFileFilter fileFilter, FileFilter dirFilter),若是你想把文件與目錄所有列出來,可使用它。

1.4使用Java 8從文本文件一次性讀取全部內容

在許多場合下,數據科學家所擁有的數據是文本格式的。咱們有不少方法能夠用來讀取文本文件的內容,這些方法各具優缺點:一些方法執行起來耗時、耗內存,而另外一些方法執行速度很快,也不須要消耗太多計算機內存;一些方法能夠把所有文本內容一次性讀出,而另外一些方法則只能一行行地讀取文本文件。至於到底要選擇哪一種方法,則取決於你所面對的任務,以及你決定採用何種方法來處理這個任務。

在這部分中,咱們將演示使用Java 8把文本文件的所有內容一次性讀出來的方法。

操做步驟

1.首先,建立一個String對象,用來保存待讀取的文本文件的目錄與名稱。

2.使用Paths類的get()方法,能夠獲得待讀文件的路徑。get()方法的參數是String對象,用來指定文件名,它的輸出做爲lines()方法的輸入。lines()方法包含於Files類之中,用來讀取一個文件的全部行,而且返回Stream,也就是說,這個方法的輸出定向到一個Stream變量。由於咱們的dummy.txt

文件中包含字符串數據,因此把Stream變量的泛型設置爲String。整個讀取過程須要放入一個try...catch塊中,用來應對讀取過程當中可能發生的異常,好比當試圖讀取的文件不存在或已損壞時,就會拋出異常。

下面代碼用來把dummy.txt文件中的內容所有顯示出來。在stream變量中包含着文本文件的全部行,因此須要使用它的forEach()方法顯示出每行內容。

​1.5使用Apache Commons IO從文本文件一次性讀取全部內容

在上一節中咱們學習了使用Java8從文本文件中一次性讀取全部內容,其實咱們也可使用Apache Commons IO API一次性讀取文本文件的全部內容。

準備工做

開始以前,須要作以下準備。

1.本部分,咱們會用到一個名爲Apache Commons IO的Java庫。

2.在Eclipse中,把下載好的JAR文件包含到你的項目中。

操做方法

1.假設你要讀取的文件爲dummy.txt,它位於C:/目錄之下。首先,須要建立一個文件對象,用來訪問這個文件,以下所示:

​2.接着,建立一個字符串對象,用來保存文件中的文本內容。這裏咱們要使用readFileToString()

方法,它來自於Apache Commons IO庫,是FileUtils類的一個成員方法。調用這個方法的方式有不少,可是如今,你只需知道咱們要傳遞兩個參數給它,第一個參數是file對象,用來指定要讀取的文件,第二個參數是文件的編碼,在示例中,咱們將其設置爲UTF-8。

​3.只要使用上面兩行代碼,咱們就能夠讀取文本文件內容,並將它們存入一個String變量中。可是,你可不是一個普通的數據科學家,你比其餘人要聰明得多。因此,你在上面兩行代碼的先後又添加了幾行代碼,用來處理Java方法拋出的異常,好比你試圖讀取的文件不存在或者已經損壞,就會觸發異常。爲此,咱們須要把上面兩行代碼放入到一個try...catch塊之中,以下所示:

​1.6 使用Apache Tika提取PDF文本

在解析與提取數據時,最難搞的文件類型之一是PDF文件。有些PDF文件甚至沒法解析,由於它們有密碼保護,而其餘一些則包含着掃描的文本與圖像。因此,這種動態文件類型有時會成爲數據科學家的夢魘。本部分演示如何使用Apache Tika從PDF文件提取文本,固然前提是PDF文件沒有被加密,也沒有密碼保護,而只包含非掃描的文本。

準備知識

開始以前,須要先作以下準備。

1.下載Apache Tika 1.10 JAR文件,而且將其做爲外部Java庫包含到你的Eclipse項目中。

2.把任意一個未鎖定的PDF文件保存到C:/目錄之下,而且命名爲testPDF.pdf。

操做步驟

1.建立一個名稱爲convertPdf(String)的方法,它帶有一個字符串參數,用來指定PDF文件名稱。

​2.建立一個輸入流,用來以字節流的形式包含PDF數據。

​3.建立一個try塊,以下所示

​4.把文件指派給剛剛建立好的stream。

​5.在Apache Tika包中包含着許多不一樣的解析器。若是你不知道該選用哪個,或者說你還有其餘類型的文檔須要轉換,那麼你應該使用AutoDetectParser解析器,以下所示:

​6.建立一個handler,用來處理文件的正文內容。請注意,建立時須要把構造函數的參數設爲-1

。一般,Apache Tika會對處理的文件進行限制,要求它至多包含100 000個字符。使用-1讓這個handler忽略這個限制。

​7.建立一個metadata對象。

​8.調用解析器對象的parser()方法,並把上面建立的這些對象傳遞給它。

​9.使用handler對象的tostring()方法,獲取從文件中提取的正文文本。

​10.關閉try塊,而且添加catch與finally塊。最後,關閉整個方法,以下所示:

​下面代碼包含convertPdf(String)方法的完整代碼,以及相應的類與驅動方法。在調用convertPdf(String)方法時,你須要提供待轉換的PDF文件的路徑與名稱,即把該方法的參數指定爲C:/testPDF.pdf。

​ 1.7 使用正則表達式清洗ASCII文本文件

ASCII文本文件中一般會包含一些非必要的字符,這些字符一般產生於轉換過程當中,好比把PDF轉換爲文本或把HTML轉換爲文本的過程當中。而且,這些字符經常被看做噪聲,它們是數據處理的主要障礙之一。本部分,咱們學習使用正則表達式爲ASCII文本數據清洗一些噪聲的方法。

操做步驟

1.建立一個名爲cleanText(String)的方法,它帶有一個String類型的參數,用來指定要清洗的文本。

​2.在你的方法中,添加以下幾行代碼,然後把清洗後的文本返回,並關閉方法。在以下代碼中,第一行代碼用來去掉非ASCII字符,緊接的一行用來把連續的空格字符替換爲單個空格字符。第三行用來清除全部ASCII控制字符。第四行用來去除ASCII非打印字符。最後一行用來從Unicode移除非打印字符。

​如下代碼是方法的完整代碼,包含相應類與驅動方法。

​1.8 使用Univocity解析CSV文件

對數據科學家來講,另外一種常常處理的文件格式是CSV(逗號分隔)文件,在這種文件中數據之間經過逗號進行分隔。CSV文件很是流行,由於大部分電子表格應用程序均可以讀取它,好比MS Excel。

本部分,咱們將學習解析CSV文件,以及處理所提取的數據點的方法。

準備工做

開始以前,須要先作以下準備。

1.下載Univocity JAR文件,並將其做爲外部庫添加到你的Eclipse項目中。

2.使用Notepad建立一個CSV文件,它包含以下數據。建立好以後,把文件的擴展名修改成.csv

,並把它保存到C盤之下,即C:/testCSV.csv。

操做步驟

1.建立一個名爲parseCsv(String)的方法,它帶有一個String類型的參數,用來指定待解析的文件名。

​2.然後建立一個配置對象,該對象用來提供多種配置選項。

​3.藉助於配置對象,你能夠打開解析器的自動檢測功能,讓它自動偵測輸入中包含何種行分隔符序列。

​4.建立一個RowListProcessor對象,用來把每一個解析的行存儲在列表中。

​5.你可使用RowProcessor來配置解析器,以對每一個解析行的值進行處理。你能夠在com.univocity.parsers.common.processor包中找到更多RowProcessors,可是你也能夠本身建立。

​6.若是待解析的CSV文件包含標題頭,你能夠把第一個解析行看做文件中每一個列的標題。

​7.接下來,使用給定的配置建立一個parser實例。

​8.parser實例的parse()方法用來解析文件,並把每一個通過解析的行指定給前面定義的RowProcessor。

​9.若是解析中包含標題,則可以使用以下代碼獲取這些標題。

​10.隨後,你能夠很容易地處理這個字符串數組,以獲取這些標題值。

11.另外一方面,咱們在列表中能夠找到行值。只要使用一個for循環便可把列表打印出來,以下所示。

​12.最後,關閉方法。

​整個方法的完整代碼以下所示:

​有不少採用Java編寫的CSV解析器。可是,相比較而言,Univocity是執行速度最快的一個。​

本文摘自《Java數據科學指南》

​《Java數據科學指南》

[加]魯什迪·夏姆斯(Rushdi Shams) 著

點擊封面購買紙書


學習MLlib、DL4j和Weka等開源庫,掌握實用的Java數據科學技能

本書旨在經過Java編程來引導讀者更好地完成數據科學任務。本書經過9章內容,詳細地介紹了數據獲取與清洗、索引的創建和檢索數據、統計分析、數據學習、信息的提取、大數據處理、深度學習、數據可視化等重要主題。

今日互動

你對本書的見解?爲何?截止時間5月31日17時,留言+轉發本活動到朋友圈,小編將抽獎選出3名讀者贈送紙書1本和2張e讀版80元異步社區代金券,(留言點贊最多的自動得到一張)。異步圖書後臺回覆「5月新書」進入新書交流羣,得到第一手新書信息, 點擊此處直接參加活動。

推薦閱讀

2018年5月新書書單(文末福利)

2018年4月新書書單

異步圖書最全Python書單

一份程序員必備的算法書單

第一本Python神經網絡編程圖書

​長按二維碼,能夠關注咱們喲

天天與你分享IT好文。


在「異步圖書」後臺回覆「關注」,便可免費得到2000門在線視頻課程;推薦朋友關注根據提示獲取贈書連接,免費得異步e讀版圖書一本。趕忙來參加哦!

點擊閱讀原文,購買《Java數據科學指南》

閱讀原文

相關文章
相關標籤/搜索