我正在尝试从csv文件中删除重复的组合。
我尝试使用Distinct,但似乎保持不变。
string path;
string newcsvpath = @"C:\Documents and Settings\MrGrimm\Desktop\clean.csv";
OpenFileDialog openfileDial = new OpenFileDialog();
if (openfileDial.ShowDialog() == DialogResult.OK)
{
path = openfileDial.FileName;
var lines = File.ReadLines(path);
var grouped = lines.GroupBy(line => string.Join(", ", line.Split(',').Distinct())).ToArray();
var unique = grouped.Select(g => g.First());
var buffer = new StringBuilder();
foreach (var name in unique)
{
string value = name;
buffer.AppendLine(value);
}
File.WriteAllText(newcsvpath ,buffer.ToString());
label5.Text = "Complete";
}
例如,我有
的组合{ 1,1,1,1,1,1,1,1 } { 1,1,1,1,1,1,1,2 }
{ 2,1,1,1,1,1,1,1 } { 1,1,1,2,1,1,1,1 }
输出应为
{ 1,1,1,1,1,1,1,1 }
{ 2,1,1,1,1,1,1,1 }
答案 0 :(得分:1)
在您的示例中,您似乎希望将每一行视为一个数字序列,并且如果一个序列是另一个序列的置换,则认为两行相等。
因此,通过阅读文件,您可以:
var lines = new[]
{
"1,1,1,1,1,1,1,1",
"1,1,1,1,1,1,1,2",
"2,1,1,1,1,1,1,1",
"1,1,1,2,1,1,1,1"
};
现在让我们将其转换为数字序列数组:
var linesAsNumberSequences = lines.Select(line => line.Split(',')
.Select(int.Parse)
.ToArray())
.ToArray();
或者更好,因为我们对排列不感兴趣,所以我们可以立即对序列中的数字进行排序:
var linesAsSortedNumberSequences = lines.Select(line => line.Split(',')
.Select(int.Parse)
.OrderBy(number => number)
.ToArray())
.ToArray();
在此方法上使用Distinct时,我们必须传递一个认为两个数组相等(如果它们具有相同元素)的comarer。让我们使用this SO question
中的一个var result = linesAsSortedNumberSequences.Distinct(new IEnumerableComparer<int>());
答案 1 :(得分:0)
尝试
HashSet<string> record = new HashSet<string>();
foreach (var row in dtCSV.Rows)
{
StringBuilder textEditor= new StringBuilder();
foreach (string col in columns)
{
textEditor.AppendFormat("[{0}={1}]", col, row[col].ToString());
}
if (!record.Add(textEditor.ToString())
{
}
}