1. 程式人生 > 其它 >比較兩個檔案的差集

比較兩個檔案的差集

技術標籤:Golangset

比較兩個檔案的差集,並匯出檔案到difference.txt中:

1.已存在要比較的兩個檔案,分別為a.txt和b.txt,要找出兩檔案的差集(屬於a.txt但不屬於b.txt): 介面3

2.最終輸出結果並匯入difference.txt檔案:

我是利用set包(另外也可以通過map實現),實現如下:

// 比較兩個檔案API介面的差集,並匯出檔案到difference.txt中:
func FilterDuplicateData() {
	// 開啟檔案
	aFile, err := os.OpenFile("./a.txt", os.O_RDWR, os.ModePerm)
	if err != nil {
		fmt.Println("a.txt os.OpenFile() error !")
		return
	}
	bFile, err := os.OpenFile("./b.txt", os.O_RDWR, os.ModePerm)
	if err != nil {
		fmt.Println("b.txt os.OpenFile() error !")
		return
	}

	// 差集比較
	aSet := set.New(set.ThreadSafe)
	bSet := set.New(set.ThreadSafe)
	aReader := bufio.NewReader(aFile)
	bReader := bufio.NewReader(bFile)

	// read file:
	for {
		aByteData, _, err := aReader.ReadLine()
		if err == io.EOF {
			fmt.Println("aReader.ReadLine() error : ", err)
			break
		}
		aSet.Add(string(aByteData))
	}
	//fmt.Println("aSet:", aSet.String())

	for {
		bByteData, _, err := bReader.ReadLine()
		if err == io.EOF {
			fmt.Println("bReader.ReadLine() error : ", err)
			break
		}
		bSet.Add(string(bByteData))
	}
	//fmt.Println("bSet:", bSet.String())

	differenceResult := set.Difference(aSet, bSet) //
	fmt.Println("差集(屬前者不屬後者):\n", differenceResult)

	// 匯入結果到新檔案:
	cFile, err := os.OpenFile("./difference.txt", os.O_CREATE | os.O_RDWR, os.ModePerm)
	if err != nil {
		fmt.Println("a.txt os.OpenFile() error !")
		return
	}

	writer := bufio.NewWriter(cFile)
	for _, val := range differenceResult.List() {
		strData, ok := val.(string)
		if !ok {
			fmt.Println("type assert error !")
			return
		}
		//fmt.Println("---", strData)
		_, err = writer.WriteString(strData + "\n")
		if err != nil {
			fmt.Println("writer.WriteString error : ", err)
			return
		}
		writer.Flush() // 重新整理會將所有緩衝的資料寫入基礎io.Writer,同時釋放緩衝區,以便於下一次資料能完整的寫入緩衝區
	}
}