按列和值比较两个csv文件并显示不同值的行号

时间:2016-07-06 11:47:41

标签: c# linq csv

我正在为两个具有列和相应值的csv文件进行比较 对于每个新行的每一列。列在文件的第一行指定。之后的每一行都包含每列的数据。

我正在尝试创建一个程序,可以处理具有不同行号和列数的文件,还可以显示不同值的行号,然后创建一个显示行号列的新文本文件文件1和文件2的名称和值。

应该根据某些标识符而不是逐行进行比较。 如果列行中指定的某些列数据丢失,则可能会显示缺少数据的列数。

所以例如:
   worker1.csv:

  

名称;年龄;身高;性别;
    鲍勃; 21; 190;男
    约翰; 35; 182;男
    玫瑰;
    玛丽; 20; 175;女

worker2.csv

  

名称;年龄;身高;性别
    鲍勃; 21; 185;男
    约翰; 30; 186;男
    玛丽;

output.csv

  

玛丽的不同之处:
    文件2,行号3,缺少三个值
    Bob中发现的差异:
    文件1,行号1,高度:190
    文件2,行号1,高度:185
    约翰的差异:
    文件1,行号2,年龄:35,高度:182
    文件2,行号3,年龄:30,身高:186

我该怎么做?我确实研究过LINQ的两个文件行,但我怎样才能获得行号?

2 个答案:

答案 0 :(得分:2)

它首次出现时有点复杂。但如果你一步一步地接近它,它是可行的。

我将假设您有足够的内存将其中一个文件的记录加载到字典中。如果你的文件非常大,事情会变得复杂得多。

您要做的第一件事是将其中一个文件加载到字典中,并按ID编制索引。在我的例子中,我假设ID是名称。每条记录都将记录在import * as types from '../actions/actionTypes'; export default function helpsReducer(state = { isFetching: false, items: [], }, action) { switch (action.type) { case types.HELPS_FEED_REQUEST: return Object.assign({}, state, { isFetching: true, }); case types.HELPS_FEED_SUCCESS: return Object.assign({}, state, { isFetching: false, items: [ ...state.items, ...action.items, ], }); default: return state; } } 实例中:

FileLine

你的词典:

class FileLine
{
    public int LineNumber;
    public string Name;
    public int Age;
    public int Height;
    public string Gender;
}

现在,将文件读入该词典:

Dictionary<string, FileLine> File1Lines = new Dictionary<string, FileLine>();

现在,您可以阅读第二个文件,在字典中查找该项目,并报告任何差异:

int lineNumber = 0;
foreach (var line in File.ReadLines("worker1.csv")
{
    // split the line and assign the fields.
    // End up with name, age, height, and gender variables.
    ++lineNumber;
    var theLine = new FileLine(
        LineNumber = lineNumber,
        Name = name,
        Age = age,
        Height = height,
        Gender = gender);
    File1Lines.Add(theLine.Name, theLine);
}

现在,如果要跟踪第一个文件中但不在第二个文件中的行,则创建lineNumber = 0; foreach (var line in File.ReadLines("worker2.csv")) { // split the line and create a FileLine instance. // we'll call it line2 // Then, look to see if that line is in the File1Lines dictionary. FileLine line1; if (!File1Lines.TryGetValue(line2.Name, out line1)) { // the line didn't exist in the first file } else { // Now compare individual fields if (line2.Age != line1.Age) { // report that fields are different } // Do the same with other fields } } ,每当在第二个文件中找到记录时,将名称添加到哈希集。完成第二个文件后,可以将哈希集与字典中的键进行比较。因此,如果您的哈希集被称为HashSet<string>,那么您将拥有:

FoundRecords

答案 1 :(得分:0)

从两个foreach循环中,你可以找到差异,或者使用for循环也可以:

string[] content1 = File.ReadAllLines(@"worker1.csv");
string[] content2 = File.ReadAllLines(@"worker2.csv");
for(int i = 0; i < content1.Length; i++)
{
  // check here every line, i is your line number
}
for(int i = 0; i < content2.Length; i++)
{
  // check here every line, i is your line number
}