Go如何自動解壓縮包?如何讀取docx/doc檔案內容?

王中陽Go發表於2023-03-28
在開發過程中,我們常常需要處理壓縮包和檔案檔案。本文將介紹如何使用Go語言自動解壓縮包和讀取docx/doc檔案。

一、解壓縮包

壓縮包格式

常見的壓縮包格式有zip、gzip、bzip2等。在Go語言中,使用archive/zip、compress/gzip、compress/bzip2包可以輕鬆地處理這些格式的檔案。

解壓zip檔案

使用archive/zip包中的函式,我們可以輕鬆地操作zip檔案。首先,我們需要開啟zip檔案:

zipFile, err := zip.OpenReader(zipPath)
if err != nil {
    return err
}
defer zipFile.Close()

上面的程式碼使用zip.OpenReader函式開啟一個zip檔案,並返回一個*zip.ReadCloser型別的物件,表示zip檔案內容的讀取器和關閉器。注意:在讀取完zip檔案後,記得使用defer語句關閉該檔案。

接著,我們可以使用Read()函式來解壓zip檔案中的每一個檔案,並將其寫入到本地磁碟:

for _, zipFileInfo := range zipFile.Reader.File {
    dstPath := filepath.Join(outputDir, zipFileInfo.Name)
    dstDir := filepath.Dir(dstPath)
    err = os.MkdirAll(dstDir, 0755)
    if err != nil {
        return err
    }

    dstFile, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, zipFileInfo.Mode())
    if err != nil {
        return err
    }

    srcFile, err := zipFileInfo.Open()
    if err != nil {
        dstFile.Close()
        return err
    }

    _, err = io.Copy(dstFile, srcFile)
    dstFile.Close()
    srcFile.Close()

    if err != nil {
        return err
    }
}

上面的程式碼中,我們首先拼接出本地檔案路徑,並建立其所在的目錄結構。接著,使用os.OpenFile()函式以寫入模式開啟本地檔案,並使用zipFileInfo.Mode()函式獲取zip檔案中該檔案的許可權資訊。使用zipFileInfo.Open()函式將zip檔案中的檔案開啟,並使用io.Copy()函式將其寫入到本地檔案中。如果出現任何錯誤,記得關閉本地檔案和zip檔案中的檔案,以便資源得以正確釋放。

解壓gzip檔案

使用compress/gzip包,我們也可以輕鬆地解壓gzip檔案。具體方法如下:

gzipFile, err := os.Open(gzipPath)
if err != nil {
    return err
}
defer gzipFile.Close()

gzipReader, err := gzip.NewReader(gzipFile)
if err != nil {
    return err
}
defer gzipReader.Close()

dstPath := filepath.Join(outputDir, filepath.Base(gzipPath))
dstFile, err := os.OpenFile(dstPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
if err != nil {
    return err
}
defer dstFile.Close()

_, err = io.Copy(dstFile, gzipReader)
if err != nil {
    return err
}

上面的程式碼首先開啟gzip檔案,並使用gzip.NewReader()函式建立一個gzip.Reader型別的物件,表示gzip檔案內容的讀取器。記得在讀取完該檔案之後關閉相關檔案(即:gzip檔案和讀取器檔案)。然後,透過使用os.OpenFile()函式以寫入模式開啟目標檔案,並將gzip讀取器中的內容複製到目標檔案中即可。記得在操作完目標檔案後關閉相關檔案,以便資源成功釋放。

解壓bzip2檔案

使用compress/bzip2包,可以輕鬆地解壓bzip2檔案。方法如下:

bzip2File, err := os.Open(bzip2Path)
if err != nil {
    return err
}
defer bzip2File.Close()

bzip2Reader := bzip2.NewReader(bzip2File)

dstPath := filepath.Join(outputDir, filepath.Base(bzip2Path))
dstFile, err := os.OpenFile(dstPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
if err != nil {
    return err
}
defer dstFile.Close()

_, err = io.Copy(dstFile, bzip2Reader)
if err != nil {
    return err
}

上面的程式碼中,我們使用bzip2.NewReader()函式建立一個bzip2.Reader型別的物件,表示bzip2檔案內容的讀取器。然後,以寫入模式開啟目標檔案,將讀取器中的內容複製到目標檔案中,並在完成後關閉相關檔案,釋放資源。

二、讀取docx/doc檔案

docx/doc檔案是一種二進位制檔案格式,我們可以使用第三方庫來讀取其中的內容。Word檔案通常使用.doc或.docx格式儲存,其中.doc是二進位制格式,而.docx則是XML格式的檔案。接下來,我們將分別介紹如何讀取這兩種檔案格式的內容。

讀取.doc格式檔案

我們可以使用github.com/LopPay/office-parser/ole、github.com/LopPay/office-parser/common和github.com/LopPay/office-parser/msdoc分別來處理ole檔案、解析doc檔案和讀取doc檔案中的資料。該庫已經封裝了所有的文字、圖片、表格等元素的解析和轉換。

下面是一個簡單的讀取doc檔案的程式:

docFile, err := os.Open(docPath)
if err != nil {
    return err
}
defer docFile.Close()

docData, err := msdoc.ParseDocFile(docFile)
if err != nil {
    return err
}

for _, para := range docData.Paragraphs {
    for _, run := range para.Runs {
        fmt.Print(run.Text)
    }
    fmt.Println()
}

上面的程式碼中,我們首先使用os.Open()函式開啟doc檔案,並使用msdoc.ParseDocFile()函式解析該檔案。該函式返回一個msdoc.Document型別的物件,該物件包括文字、圖片、表格等資訊。下面的程式碼將遍歷每一個段落和其中的Run例項,並將其內容輸出到控制檯。

讀取.docx格式檔案

我們可以使用第三方庫github.com/unidoc/unioffice來讀取.docx格式的檔案。該庫支援讀取和寫入單個檔案、讀取和寫入多個檔案、轉換和操作表格、影像、段落、樣式等操作。

下面是一個簡單的讀取.docx檔案的程式:

docFile, err := os.Open(docxPath)
if err != nil {
    return err
}
defer docFile.Close()

doc, err := document.Open(docFile)
if err != nil {
    return err
}

for _, para := range doc.Paragraphs() {
    for _, run := range para.Runs() {
        fmt.Print(run.Text())
    }
    fmt.Println()
}

上面的程式碼中,我們首先使用os.Open()函式開啟docx檔案,並使用document.Open()函式解析該檔案。該函式返回一個document.Document型別的物件,該物件包括文字、圖片、表格等資訊。下面的程式碼將遍歷每一個段落和其中的Run例項,並將其內容輸出到控制檯。

三、總結

本文介紹瞭如何使用Go語言自動解壓縮包和讀取docx/doc檔案。具體來說,我們使用了相應的第三方庫和Go語言內建庫中的程式碼。

上述程式碼執行起來比較簡單,適合初學者學習和實踐。希望對大家有幫助,大家可以自行根據需求進行修改和擴充套件。

一起學習

歡迎大家關注我,點贊、留言、轉發。

你的支援,是我更文的最大動力!

相關文章