从csv

时间:2019-05-05 03:16:50

标签: c#

我正在尝试从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 } 

2 个答案:

答案 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())
    {
    }
}