天天看點

去除源檔案中的重複行的程式流程及其C代碼實作

一、需求描述

要求對一個包含若幹行記錄且某幾條記錄相同的檔案(源檔案)實作去重操作,并将去重之後的記錄寫入到另外一個檔案(目的檔案)中。也即最後生成的檔案中沒有内容相同的兩行記錄。如果源檔案中兩條記錄之間有空行,則在目的檔案中一并将其去掉。

兩條記錄相同的标準是:

1) 字元個數及内容完全相同。

2) 去除空格及回車換行符之後的内容完全相同。

示例:

源檔案樣例:

對應的目的檔案樣例:

二、程式總體流程

為了實作去重操作,我們考慮使用連結清單資料結構。先将源檔案中的記錄内容逐條讀取,與連結清單中已經存在的記錄内容相比較,如果沒有與之相同的,則将該條記錄加傳入連結表。當源檔案中的所有記錄内容都讀取完成之後,再将連結清單中的記錄内容寫入到目的檔案中。

程式的總體流程如圖1所示。

去除源檔案中的重複行的程式流程及其C代碼實作

圖1 程式的總體流程

三、重要程式流程及資料結構介紹

1.存放記錄内容的連結清單

本程式使用連結清單來存放從源檔案中讀取到的每條記錄,該連結清單的結構如下:

2.判斷某條記錄是否已存在于連結清單的函數

每當讀取到一條記錄,就要判斷該條記錄是否已經存在于連結清單中了(第一條記錄除外)。判斷操作非常的簡單,隻需要周遊整個連結清單就可以了。該操作由IsInList函數實作,其具體代碼如下:

3.去除記錄的回車換行符、去除記錄中的空格的函數

RmNewLine函數用于去除記錄的回車換行符,RemoveSpaceInStr函數用于去除記錄中的空格。這兩個函數的程式代碼請見附錄。

四、程式編譯及執行結果

将RemoveRepeatLine.c(詳細的代碼請見附錄)程式上傳到Linux機器上,使用gcc -g -o RemoveRepeatLine RemoveRepeatLine.c指令對其編譯,生成RemoveRepeatLine。

在本程式中,我們使用的源檔案為TestFile.txt,位于目前使用者的zhouzhaoxiong/zzx/RemoveRepeatLine/TestFile目錄下;生成的目的檔案為ResultFile.txt,與源檔案位于相同的目錄之下。

本人使用的源檔案TestFile.txt的内容為:

運作RemoveRepeatLine指令之後,生成結果檔案ResultFile.txt,其内容為:

可見,程式滿足了需求,去除了重複的行,同時将多餘的空行也去掉了。

五、總結

關于本程式,有如下幾點說明:

第一,連結清單這種資料結構在實際的軟體開發項目中應用得非常的廣泛,大家一定要熟練掌握其用法,特别是如何向連結清單中插入資料、如何周遊整個連結清單、如何清空連結清單等。

第二,寫檔案函數WriteToFile中,在“strncpy(szContentBuf, ptContentListHead->szContentLine, strlen(ptContentListHead->szContentLine));”語句之前,一定要加上“memset(szContentBuf, 0x00, sizeof(szContentBuf));”語句,否則寫入檔案中的内容可能不是我們想要的。大家也可以在自己的機器上試試,看加與不加“memset(szContentBuf, 0x00, sizeof(szContentBuf));”語句,生成的結果檔案有何差別。

第三,在有關話單生成及處理的程式中,對源話單檔案進行去重操作是大家必須考慮的問題。本文中的程式為相關項目的開發人員提供了參考。

附:完整的程式代碼

繼續閱讀