2016-01-13 113 views
-3

下面是示例...如何在csv或txt中查找缺失的行? (複雜)

文件1:

1; 01812345; BB100

2; 018ACBA5; BB100

3; 01955555; BB100

10; 01901022; BB100

文件2:(不同的MAC地址還有丟失3)

1; 01866666; BB101

2; 01877777; BB101

10; 01988888; BB101

如何很快確定我缺少3;?我不能比較整行,因爲我只需要比較第一個整數值之前第一個;

我需要一些自動化的解決方案,因爲我工作與300地址列表和它不連續。

回答

0

在對我的另一個答案的評論中,你說過這個任務是你經常會做的事,你也表達了對自動化的期望。這是一個小型的C++程序,應該可以工作:像prg file1 file2一樣使用它來查找file1中的行,並使用file2中缺少的密鑰。要從file1中丟失行,請切換參數的順序:prg file2 file1

#include <iostream> 
#include <string> 
#include <map> 
#include <fstream> 

using namespace std; 

typedef map< string, string > tMap; 

bool readFileIntoMap(string fn, tMap &m) 
{ 
    ifstream inFile(fn, std::ios::in); 
    if(!inFile.good()){ 
     std::cout << "Could not open " << fn << std::endl; 
     return false; 
    } 

    string key, aLine; 
    string::size_type pos; 
    while (inFile) { 
     getline(inFile, aLine) ; 

     pos = aLine.find(';'); 
     if(pos != string::npos) { 
      key = aLine.substr(0, pos); 
     } else { 
      key = "-1"; 
     } 

     m[ key ] = aLine; // map key to complete line 
    } // of while 
    return true; 
} 

// check for each key of first file: if the key is present in the 
// second file, if not: report the line from the first file 
void findMissingKeys(tMap &leftMap, tMap &rightMap) 
{ 
    string leftKey; 
    for(auto &leftElem : leftMap) { 
     leftKey = leftElem.first; 

     auto it = rightMap.find(leftKey); 
     if(it == rightMap.end()) { 
      // report missing line in second file 
      cout << leftElem.second << endl; 
     } 
    } 
} 

int main(int argc, char* argv[]) { 
    if (argc != 3) { 
     cerr << "Please provide exactly two filenames as argument!" << endl; 
     cerr << "Program will dump lines with a key present in first and missing in second file." << endl; 
     return 1; 
    } 

    tMap m1, m2; 

    readFileIntoMap(argv[1], m1); 
    readFileIntoMap(argv[2], m2); 

    findMissingKeys(m1,m2); 
} 
+0

我會嘗試此代碼現在... 我不明白爲什麼我的問題被評爲負面... – Orion310591

+1

如果有人讀這個,我用DevC++(50mb安裝)編譯代碼,我不得不添加「-std = c工具>編譯器選項「中的」++ 11「(不含引號)。 – Orion310591

+0

這工作!我向你們致敬!再次感謝我希望我有這個15代表所需,所以我可以upvote您的評論。 我剛剛發現我可以使用Shift +右鍵點擊內部文件夾來獲得選項「在這裏打開命令窗口」,並給我提示該位置的cmd提示符...再次感謝代碼。 – Orion310591

1
  1. 創建每個文件的副本。
  2. 分號後取出一部分,用正則表達式替換:
    • 查找內容;.*$
    • 替換:(留空)
    • 檢查**正則表達式*在較低左
    • 點擊更換所有
  3. 對每個副本進行排序(編輯 - >行操作 - >排序)。
    • 也許排序後,您可以通過查看文件找到額外的行,否則繼續下一步。
  4. 比較排序的說法:差異給你的是一個或其他文件(原始的未排序文件)中的行。有幾個選項來自動比較:
    • 有一個記事本+ +插件叫做比較,你可以通過插件管理器安裝
    • 你可以使用一個單獨的程序一樣的WinMerge
  5. 一旦你知道該行可以查找缺失的行並將其添加到其他文件中

另一種選擇是將兩個文件的行插入到新文件中,然後對新文件進行排序。現在您需要在第一列中找到具有唯一編號的行。但我會使用比較工具或比較插件如上所述。它使差異更容易被發現。

+0

感謝信息我會試試這個,但有沒有解決方案的可能性,而不創建副本,或額外的步驟? 是否有一些記事本或一些軟件的插件,「在一定條件下發現差異」?條件是首先掃描/僅比較整數值;登錄該行 – Orion310591

+0

我現在的答案是最簡單的方法(我現在可以想到),以獲得你想要的。 合併文件的常用方法是附加一個文件,排序然後刪除重複項。但是你的重複只在第一列中重複,而其餘的行可以不同。 –

+0

我想在CI中創建一些基本的應用程序可以編譯它,如果我得到的代碼,即時通訊缺少幾行,當我比較第一個值如何跳過掃描,直到指針命中新行,或新行中的第一個整數值,在第一個文件中檢測到的指針只應該向下整行 – Orion310591