2016-01-13 109 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