返回文章列表

命令列工具資料取得與處理

本文介紹如何使用命令列工具進行資料的取得、處理與轉換,涵蓋從網路下載資料、解壓縮檔案、資料函式庫查詢到試算表轉換等技巧。尤其針對 `curl` 指令的應用,搭配 `pup`、`trim` 等工具,示範如何有效率地擷取和處理網路上的資料。此外,文章也提供處理壓縮檔案和轉換 Excel

資料科學 Web 開發

在資料科學專案中,取得和處理資料是至關重要的第一步。許多時候,資料散落在不同的地方,格式也各不相同,這使得資料的收集和整理變得相當繁瑣。利用命令列工具,可以有效率地自動化這些流程。本文將介紹如何使用 curltarin2csv 等命令列工具,從網路下載資料、解壓縮檔案、查詢資料函式庫以及處理不同格式的資料,讓資料處理流程更加流暢。這些工具的組合使用,能大幅提升資料科學家的工作效率,讓他們更專注於資料分析和模型建立。尤其在處理大量資料或需要自動化流程時,命令列工具更是不可或缺的利器。

取得資料:資料科學的第一步

在資料科學的實踐過程中,第一步便是取得所需的資料。沒有資料,資料科學就無從談起。本章節將探討如何利用命令列工具來取得資料,包括下載資料、查詢資料函式庫以及處理壓縮檔案等。

為何命令列工具是處理資料的好幫手?

Unix哲學強調文字是通用的介面。幾乎所有的命令列工具都能夠處理文字輸入、輸出或是兩者兼具。這使得命令列工具之間能夠無縫協作,從而高效地完成各種任務。

取得資料的多種方式

資料可以透過多種方式取得,例如從伺服器下載、查詢資料函式庫或連線到Web API。有時,資料會以壓縮格式或二進位格式(如Microsoft Excel試算表)呈現。本章節將介紹多種命令列工具,幫助您處理這些不同的資料格式。

使用curl下載資料

curl是一個強大的工具,用於從伺服器下載資料。以下是一些基本用法:

curl -O https://example.com/data.csv

內容解密:

  • curl指令用於從指定的URL下載檔案。
  • -O引數讓curl將檔案儲存到本地,檔案名稱與遠端檔案相同。

處理CSV檔案:使用in2csv

當資料以非CSV格式儲存時,可以使用in2csv將其轉換為CSV格式,以便進一步處理。

in2csv data.xlsx > data.csv

內容解密:

  • in2csv指令用於將其他格式的試算表檔案轉換為CSV格式。
  • data.xlsx是輸入檔案,> data.csv將轉換後的CSV資料輸出到data.csv檔案中。

從資料函式庫查詢資料:使用sql2csv

對於儲存在資料函式庫中的資料,可以使用sql2csv執行SQL查詢並將結果輸出為CSV檔案。

sql2csv --db "sqlite:///database.db" --query "SELECT * FROM table" > result.csv

內容解密:

  • sql2csv指令用於對資料函式庫執行SQL查詢並將結果輸出為CSV檔案。
  • --db "sqlite:///database.db"指定了要連線的SQLite資料函式庫。
  • --query "SELECT * FROM table"指定了要執行的SQL查詢。
  • > result.csv將查詢結果輸出到result.csv檔案中。

處理解壓縮檔案:使用tar

對於以tar格式壓縮的檔案,可以使用以下命令進行解壓縮:

tar -xvf archive.tar

內容解密:

  • tar指令用於處理tar歸檔檔案。
  • -xvf引數分別代表:-x表示解壓縮,-v表示顯示詳細過程,-f後面跟著要操作的檔案名稱。
  • archive.tar是要解壓縮的tar檔案。

命令列工具的幫助檔案

當遇到不熟悉的命令列工具時,可以透過以下方式取得幫助:

  1. 使用man命令檢視手冊頁面,例如:man tar
  2. 使用tldr工具檢視簡化的幫助頁面,例如:tldr tar
  3. 使用命令的--help選項,例如:jq --help

資料取得與處理技術

資料來源與取得方法

本章節主要探討如何從不同來源取得資料並將其匯入 Docker 容器中進行處理。涵蓋的內容包括:複製本地檔案到 Docker 容器、從網路下載資料、解壓縮檔案、從試算表中擷取資料、查詢關聯式資料函式庫以及呼叫網頁 API。

將本地檔案複製到 Docker 容器

在進行資料處理之前,通常需要將本地檔案複製到 Docker 容器中。Docker 容器是一個隔離的虛擬環境,但它允許與本地目錄進行檔案交換。預設情況下,從執行 docker run 的目錄被對映到 Docker 容器中的 /data 目錄。

Windows 系統操作步驟
  1. 開啟命令提示字元或 PowerShell。
  2. 切換到包含目標檔案的目錄,例如 Downloads
    cd %UserProfile%\Downloads
    
  3. 將檔案複製到對映目錄。
    copy logs.csv MyDataScienceToolbox\
    
Linux 或 macOS 系統操作步驟
  1. 開啟終端機。
  2. 使用 cp 命令將檔案複製到指定目錄。
    cp ~/Downloads/logs.csv ~/my-data-science-toolbox
    

從網路下載資料

網路提供了豐富的資料來源,而 curl 是一個強大的命令列工具,用於下載網路資料。

使用 curl 下載資料
  • 基本用法:直接指定 URL 下載資料。
    curl "https://en.wikipedia.org/wiki/List_of_windmills_in_the_Netherlands" | trim
    
  • 使用 -s 選項以靜默模式下載,避免進度條輸出幹擾後續處理。
    curl -s "https://en.wikipedia.org/wiki/List_of_windmills_in_Friesland" | pup -n 'table.wikitable tr'
    
  • 將下載內容儲存到檔案。
    • 使用 -O 選項,根據 URL 自動命名檔案。
      curl -s "https://en.wikipedia.org/wiki/List_of_windmills_in_Friesland" -O
      
    • 使用 -o 選項,自訂檔名。
      curl -s "https://en.wikipedia.org/wiki/List_of_windmills_in_Friesland" -o friesland.html
      
    • 或是直接使用輸出重定向。
      curl -s "https://en.wikipedia.org/wiki/List_of_windmills_in_Friesland" > friesland.html
      

資料處理與工具介紹

除了下載資料,curl 結合其他命令列工具(如 pup)可以進一步處理和分析資料。例如,使用 pup 對 HTML 內容進行解析和提取。

#### 內容解密:

此段落詳細介紹瞭如何利用 curl 和其他命令列工具來下載和初步處理網路資料。透過管道(pipe)將 curl 的輸出傳遞給其他工具,可以實作對下載內容的進一步解析和處理,如使用 pup 解析 HTML。

#### 內容解密:

本章節提供了一系列實用的命令列操作和技巧,旨在幫助讀者掌握在 Docker 環境下進行資料處理的基本方法。透過實際範例演示瞭如何使用 curl 下載網路資料,並結合其他工具進行進一步的處理和分析。這些技術對於進行資料科學和相關領域的研究具有重要的參考價值。

其他網路協定

curl 總共支援超過 20 種網路協定。若要從 FTP 伺服器下載檔案(FTP 全稱為「檔案傳輸協定」),使用 curl 的方式與下載其他檔案相同。以下範例下載了 ftp.gnu.org 上的 welcome.msg 檔案:

$ curl -s "ftp://ftp.gnu.org/welcome.msg" | trim
NOTICE (Updated December 18 2018):
FSF public IP addresses are changing between December 20 and January 7th
If you have hardcoded the IP address of any GNU/FSF servers in those
ranges in any code or configuration files, they will need to be
updated. If you refer to our servers by their DNS name, such as
"gnu.org", then that will continue to work. You should use the DNS name
wherever possible.
... 

內容解密:

  • curl -s "ftp://ftp.gnu.org/welcome.msg" | trim:此命令使用 curl 從指定的 FTP 網址下載 welcome.msg 檔案,並透過管道(pipe)將輸出傳遞給 trim 命令以修剪輸出內容。
  • -s 引數代表「silent mode」,用於隱藏下載進度條。
  • ftp://ftp.gnu.org/welcome.msg 是要下載的檔案的 FTP 網址。
  • 輸出結果顯示了來自 ftp.gnu.org 的通知,內容有關 FSF 公共 IP 位址的變更。

如果指定的 URL 是一個目錄,curl 會列出該目錄的內容。當 URL 需要密碼保護時,可以使用 -u 選項指定使用者名稱和密碼。

DICT 協定

DICT 協定允許存取各種字典並查詢定義。以下是根據 Collaborative International Dictionary of English 對「windmill」的定義:

$ curl -s "dict://dict.org/d:windmill" | trim
220 dict.dict.org dictd 1.12.1/rf on Linux 4.19.0-10-amd64 <auth.mime> <4623255...
250 ok
150 1 definitions retrieved
151 "Windmill" gcide "The Collaborative International Dictionary of English v.0...
Windmill \Wind"mill`\, n.
A mill operated by the power of the wind, usually by the
action of the wind upon oblique vanes or sails which radiate
from a horizontal shaft. --Chaucer.
[1913 Webster]
.
...

內容解密:

  • curl -s "dict://dict.org/d:windmill" | trim:此命令查詢 DICT 伺服器以取得「windmill」的定義,並將結果修剪後輸出。
  • dict://dict.org/d:windmill 是查詢「windmill」定義的 DICT 網址。
  • 輸出結果顯示了「windmill」的定義,包括其詞性、解釋和參照來源。

跟隨重新導向

當存取縮短的 URL 時,例如以 http://bit.ly/http://t.co/ 開頭的網址,瀏覽器會自動將使用者重新導向至正確的位置。使用 curl 時,需要指定 -L--location 選項以跟隨重新導向。

$ curl -s "https://bit.ly/2XBxvwK"
<html>
<head><title>Bitly</title></head>
<body><a href="https://youtu.be/dQw4w9WgXcQ">moved here</a></body>
</html>%

內容解密:

  • curl -s "https://bit.ly/2XBxvwK":此命令嘗試存取縮短的 URL 但未跟隨重新導向,因此傳回了一個包含重新導向連結的 HTML 頁面。
  • 如果未指定 -L 選項,curl 不會自動跟隨重新導向。

若要檢查 HTTP 回應的標頭,可以使用 -I--head 選項:

$ curl -sI "https://youtu.be/dQw4w9WgXcQ" | trim
HTTP/2 303
content-type: application/binary
x-content-type-options: nosniff
cache-control: no-cache, no-store, max-age=0, must-revalidate
pragma: no-cache
expires: Mon, 01 Jan 1990 00:00:00 GMT
date: Tue, 29 Jun 2021 12:27:13 GMT
location: https://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtu.be
content-length: 0
x-frame-options: SAMEORIGIN
...

內容解密:

  • curl -sI "https://youtu.be/dQw4w9WgXcQ" | trim:此命令取得指定 URL 的 HTTP 回應標頭,並修剪輸出。
  • HTTP 狀態碼(303)表示重新導向,location 欄位指示了重新導向的目標 URL。

解壓縮檔案

當原始資料集非常龐大或是多個檔案的集合時,它可能被壓縮成一個壓縮檔。包含許多重複值的資料集(如文字檔中的單詞或 JSON 檔案中的鍵)特別適合壓縮。常見的壓縮檔副檔名包括 .tar.gz.zip.rar。要解壓縮這些檔案,可以分別使用命令列工具 tarunzipunrar

使用 tar 解壓縮 .tar.gz 檔案

$ tar -xzf logs.tar.gz

內容解密:

  • tar -xzf logs.tar.gz:此命令解壓縮名為 logs.tar.gz 的檔案。
  • -x 表示提取檔案,-z 表示使用 gzip 解壓縮演算法,-f 指定要操作的檔案名稱。

在解壓縮前檢查壓縮檔內容是一個好習慣,可以使用 -t 選項代替 -x

$ tar -tzf logs.tar.gz | trim
E1FOSPSAYDNUZI.2020-09-01-00.0dd00628
E1FOSPSAYDNUZI.2020-09-01-00.b717c457
E1FOSPSAYDNUZI.2020-09-01-01.05f904a4
E1FOSPSAYDNUZI.2020-09-01-02.36588daf
E1FOSPSAYDNUZI.2020-09-01-02.6cea8b1d

內容解密:

  • tar -tzf logs.tar.gz | trim:此命令列出 logs.tar.gz 中的檔案而不解壓縮,並修剪輸出結果。

資料解壓縮與轉換:處理多種檔案格式

在處理資料時,我們經常遇到各種壓縮檔案格式和資料儲存格式。瞭解如何有效地解壓縮和轉換這些檔案對於資料分析至關重要。本章節將介紹如何使用命令列工具處理常見的壓縮檔案格式和 Microsoft Excel 試算表。

使用 Tar 解壓縮檔案

Tar 是一種常見的壓縮檔案格式,尤其是在 Unix 和 Linux 系統中。當我們遇到 .tar.gz 檔案時,可以使用 tar 命令來解壓縮。假設我們有一個名為 logs.tar.gz 的檔案,首先,我們可以檢查檔案內容而不解壓縮:

$ tar -tzf logs.tar.gz
E1FOSPSAYDNUZI.2020-09-01-02.be4bc86d
E1FOSPSAYDNUZI.2020-09-01-03.16f3fa32
E1FOSPSAYDNUZI.2020-09-01-03.1c0a370f
E1FOSPSAYDNUZI.2020-09-01-03.76df64bf
E1FOSPSAYDNUZI.2020-09-01-04.0a1ade1b
... with 2427 more lines

內容解密:

  1. tar -tzf logs.tar.gz:使用 tar 命令列出 logs.tar.gz 中的檔案。
    • -t 選項表示列出檔案內容。
    • -z 選項表示使用 gzip 解壓縮。
    • -f 選項後面跟著要操作的檔案名稱。

為了保持目前目錄的整潔,我們可以先建立一個新的目錄,然後使用 -C 選項將檔案解壓縮到該目錄:

$ mkdir logs
$ tar -xzf logs.tar.gz -C logs
$ ls logs | wc -l
2437

內容解密:

  1. mkdir logs:建立一個名為 logs 的新目錄。
  2. tar -xzf logs.tar.gz -C logs:將 logs.tar.gz 解壓縮到 logs 目錄。
    • -x 選項表示解壓縮檔案。
    • -C 選項指定了解壓縮的目標目錄。
  3. ls logs | wc -l:計算 logs 目錄中的檔案數量。

使用 Unpack 解壓縮多種格式

除了使用特定的命令列工具外,還有一個名為 unpack 的指令碼可以簡化解壓縮的過程。根據副檔名,unpack 會呼叫適當的命令列工具來解壓縮檔案。例如:

$ unpack logs.tar.gz

內容解密:

  1. unpack logs.tar.gz:使用 unpack 指令碼解壓縮 logs.tar.gz

將 Microsoft Excel 試算表轉換為 CSV

許多資料都儲存在 Microsoft Excel 試算表中。為了在命令列工具中使用這些資料,我們需要將其轉換為 CSV 格式。雖然可以手動在 Excel 或 LibreOffice Calc 中匯出為 CSV,但這不適合大量檔案或自動化處理。

使用 in2csv 轉換 Excel 檔案

幸運的是,有一個名為 in2csv 的命令列工具可以將 Microsoft Excel 試算表轉換為 CSV 檔案。CSV 格式雖然缺乏正式規範,但 Yakov Shafranovich 定義了三個關鍵點:

  1. 每筆記錄位於單獨的一行,以換行符號分隔。
  2. 檔案中的最後一筆記錄可能有或沒有結束換行符號。
  3. 可能會有一個標頭出現在檔案的第一行,其格式與正常記錄行相同。

例如,考慮以下 CSV 檔案:

$ bat -A tmnt-basic.csv
───────┬────────────────────────────────────────────────────────────────────────
│ File: tmnt-basic.csv
───────┼────────────────────────────────────────────────────────────────────────
1 │ Leonardo,Leo,blue,two·ninjakens␊
2 │ Raphael,Raph,red,pair·of·sai␊
3 │ Michelangelo,Mikey·or·Mike,orange,pair·of·nunchaku␊
4 │ Donatello,Donnie·or·Don,purple,staff␊
───────┴────────────────────────────────────────────────────────────────────────

內容解密:

  1. bat -A tmnt-basic.csv:使用 bat 命令檢視 tmnt-basic.csv 的內容,並顯示所有不可列印的字元。

CSV 資料預設不易閱讀,可以透過管道傳輸到 csvlook 工具來格式化輸出:

$ csvlook tmnt-with-header.csv
│ name │ nickname │ mask_color │ weapon │
├──────────────┼───────────────┼────────────┼──────────────────┤
│ Leonardo │ Leo │ blue │ two ninjakens │
│ Raphael │ Raph │ red │ pair of sai │
│ Michelangelo │ Mikey or Mike │ orange │ pair of nunchaku │
│ Donatello │ Donnie or Don │ purple │ staff │

內容解密:

  1. csvlook tmnt-with-header.csv:將 tmnt-with-header.csv 的內容格式化為表格。