我正在为两个具有列和相应值的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的两个文件行,但我怎样才能获得行号?
答案 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
}