Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#从csv中删除行_C#_.net_Linq_Csv - Fatal编程技术网

c#从csv中删除行

c#从csv中删除行,c#,.net,linq,csv,C#,.net,Linq,Csv,我有两个csv文件。在第一个文件中,我有一个用户列表,在第二个文件中,我有一个重复用户列表。我试图删除第一个文件中与第二个文件相等的行 以下是我目前掌握的代码: StreamWriter sw = new StreamWriter(path3); StreamReader sr = new StreamReader(path2); string[] lines = File.ReadAllLines(path); foreach (string

我有两个csv文件。在第一个文件中,我有一个用户列表,在第二个文件中,我有一个重复用户列表。我试图删除第一个文件中与第二个文件相等的行

以下是我目前掌握的代码:

StreamWriter sw = new StreamWriter(path3);
        StreamReader sr = new StreamReader(path2);

        string[] lines = File.ReadAllLines(path);

        foreach (string line in lines)
        {
            string user = sr.ReadLine();

            if (line != user) 
            {
                sw.WriteLine(line);

            }
文件1示例:

Modify,ABAMA3C,Allpay - Free State - HO,09072701

Modify,ABCG327,Processing Centre,09085980
文件2示例:

Modify,ABAA323,Group HR Credit Risk & Finance

Modify,ABAB959,Channel Sales & Service,09071036
有什么建议吗


谢谢。

要正确关闭流,请执行以下操作:

using(var sw = new StreamWriter(path3))
using(var sr = new StreamReader(path2))
{
    string[] lines = File.ReadAllLines(path);

    foreach (string line in lines)
    {
        string user = sr.ReadLine();

        if (line != user)
        {
            sw.WriteLine(line);
        }
    }
}

有关删除或比较的真正逻辑的帮助,请回答上面El Ronnoco的评论…

您需要关闭流或使用using子句

sw.Close();

using(StreamWriter sw = new StreamWriter(@"c:\test3.txt"))
你可以使用LINQ

class Program
{
    static void Main(string[] args)
    {
        var fullList = "TextFile1.txt".ReadAsLines();
        var removeThese = "TextFile2.txt".ReadAsLines();

        //Change this line if you need to change the filter results.
        //Note: this assume you are wanting to remove results from the first 
        //      list when the entire record matches.  If you want to match on 
        //      only part of the list you will need to split/parse the records 
        //      and then filter your results.
        var cleanedList = fullList.Except(removeThese);

        cleanedList.WriteAsLinesTo("result.txt");
    }
}
public static class Tools
{
    public static IEnumerable<string> ReadAsLines(this string filename)
    {
        using (var reader = new StreamReader(filename))
            while (!reader.EndOfStream)
                yield return reader.ReadLine();
    }

    public static void WriteAsLinesTo(this IEnumerable<string> lines, string filename)
    {
        using (var writer = new StreamWriter(filename) { AutoFlush = true, })
            foreach (var line in lines)
                writer.WriteLine(line);
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var fullList=“TextFile1.txt”.ReadAsLines();
var removeThese=“TextFile2.txt”.ReadAsLines();
//如果需要更改筛选结果,请更改此行。
//注意:这假设您希望从第一个列表中删除结果
//列出整个记录匹配的时间。如果要匹配
//您只需要拆分/解析记录列表的一部分
//然后过滤你的结果。
var cleanedList=fullList.Except(除去这些);
cleanedList.WriteAsLinesTo(“result.txt”);
}
}
公共静态类工具
{
公共静态IEnumerable ReadAsLines(此字符串文件名)
{
使用(var reader=newstreamreader(文件名))
而(!reader.EndOfStream)
产生返回reader.ReadLine();
}
公共静态void WriteAsLinesTo(此IEnumerable行,字符串文件名)
{
使用(var writer=newstreamwriter(文件名){AutoFlush=true,})
foreach(行中的var行)
writer.WriteLine(行);
}
}

如果这不是家庭作业,而是生产,并且您可以安装程序集,那么如果您放下骄傲,使用VB库的一部分,您将节省3个小时的生命:

有许多例外情况(引号中逗号=legal之间的CR/LF;不同类型的引号等),这将处理excel将导出/导入的任何内容

加载从我使用的程序中提取的“Person”类的示例代码:

    Using Reader As New Microsoft.VisualBasic.FileIO.TextFieldParser(CSVPath)

        Reader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited
        Reader.Delimiters = New String() {","}
        Reader.TrimWhiteSpace = True
        Reader.HasFieldsEnclosedInQuotes = True

        While Not Reader.EndOfData
            Try
                Dim st2 As New List(Of String)
                st2.addrange(Reader.ReadFields())
                If iCount > 0 Then ' ignore first row = field names
                    Dim p As New Person
                    p.CSVLine = st2
                    p.FirstName = st2(1).Trim
                    If st2.Count > 2 Then
                        p.MiddleName = st2(2).Trim
                    Else
                        p.MiddleName = ""
                    End If
                    p.LastNameSuffix = st2(0).Trim
                    If st2.Count >= 5 Then
                        p.TestCase = st2(5).Trim
                    End If
                    If st2(3) > "" Then
                        p.AccountNumbersFromCase.Add(st2(3))
                    End If
                    While p.CSVLine.Count < 15
                        p.CSVLine.Add("")
                    End While
                    cases.Add(p)
                End If
            Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
                MsgBox("Line " & ex.Message & " is not valid and will be skipped.")
            End Try
            iCount += 1
        End While
    End Using
将Reader用作新的Microsoft.VisualBasic.FileIO.TextFieldParser(CSVPath)
Reader.TextFieldType=Microsoft.VisualBasic.FileIO.FieldType.Delimited
Reader.Delimiters=新字符串(){,“}
Reader.TrimWhiteSpace=True
Reader.HasFieldsEnclosedInQuotes=True
而不是Reader.EndOfData
尝试
Dim st2作为新列表(字符串)
st2.addrange(Reader.ReadFields())
如果iCount>0,则“忽略第一行=字段名”
Dim p作为新人
p、 CSVLine=st2
p、 FirstName=st2(1)。修剪
如果st2.Count>2,则
p、 MiddleName=st2(2).修剪
其他的
p、 MiddleName=“”
如果结束
p、 LastNameSuffix=st2(0)。修剪
如果st2.Count>=5,则
p、 TestCase=st2(5).修剪
如果结束
如果st2(3)>“那么
p、 AccountNumber fromCase.Add(st2(3))
如果结束
而p.CSVLine.Count<15
p、 CSVLine.Add(“”)
结束时
案例。添加(p)
如果结束
捕获ex为Microsoft.VisualBasic.FileIO.MalformedLineException
MsgBox(“行”&例如消息&“无效,将被跳过。”)
结束尝试
i计数+=1
结束时
终端使用
使用(var sw=new StreamWriter(path3))
使用(var sr=新的StreamReader(路径))
{
字符串[]arrRemove=File.ReadAllLines(路径2);
HashSet listRemove=新的HashSet(arrRemove.Count);
foreach(arremove中的字符串s)
{
字符串[]sa=s.Split(',');
如果(sa计数<2)继续;
添加(sa[1].toUpperCase());
}
字符串行=sr.ReadLine();
while(行!=null)
{
字符串[]sa=line.Split(',');
如果(sa计数<2)
西南写入线(行);
如果(!listRemove.contains(sa[1].toUpperCase())包含,则为else
西南写入线(行);
line=sr.ReadLine();
}
}

您所要做的就是在下面的代码中更改以下文件路径,您将从文件2中获得一个没有重复用户的文件(文件1)。这段代码的编写思想是,您需要一些易于理解的东西。当然还有其他更优雅的解决方案,但我想让它尽可能基本:

(将其粘贴到程序的主方法中)

        string line;
        StreamReader sr = new StreamReader(@"C:\Users\J\Desktop\texts\First.txt");

        StreamReader sr2 = new StreamReader(@"C:\Users\J\Desktop\texts\Second.txt");

        List<String> fileOne = new List<string>();
        List<String> fileTwo = new List<string>();

        while (sr.Peek() >= 0)
        {
            line = sr.ReadLine();
            if(line != "")
            {
                fileOne.Add(line);
            }
        }
        sr.Close();
        while (sr2.Peek() >= 0)
        {
            line = sr2.ReadLine();
            if (line != "")
            {
                fileTwo.Add(line);
            }
        }
        sr2.Close();
        var t = fileOne.Except(fileTwo);

        StreamWriter sw = new StreamWriter(@"C:\Users\justin\Desktop\texts\First.txt");

        foreach(var z in t)
        {
            sw.WriteLine(z);
        }
        sw.Flush();
字符串行;
StreamReader sr=新的StreamReader(@“C:\Users\J\Desktop\text\First.txt”);
StreamReader sr2=新的StreamReader(@“C:\Users\J\Desktop\Text\Second.txt”);
List fileOne=新列表();
List fileTwo=新列表();
而(sr.Peek()>=0)
{
line=sr.ReadLine();
如果(行!=“”)
{
fileOne.Add(行);
}
}
高级关闭();
而(sr2.Peek()>=0)
{
line=sr2.ReadLine();
如果(行!=“”)
{
fileTwo.Add(行);
}
}
sr2.Close();
var t=fileOne.Except(fileTwo);
StreamWriter sw=新StreamWriter(@“C:\Users\justin\Desktop\text\First.txt”);
foreach(t中的变量z)
{
西南写入线(z);
}
sw.Flush();

请在您的帖子中提供示例文件格式…您的代码看起来不完整,您需要关闭foreach循环,并关闭StreamWriter/ReaderLook,比如家庭作业。如果您反对,请随意更改。为什么不将两个csv文件拆分为一个列表,其中每个元素都是csv文件中的一行,然后
        string line;
        StreamReader sr = new StreamReader(@"C:\Users\J\Desktop\texts\First.txt");

        StreamReader sr2 = new StreamReader(@"C:\Users\J\Desktop\texts\Second.txt");

        List<String> fileOne = new List<string>();
        List<String> fileTwo = new List<string>();

        while (sr.Peek() >= 0)
        {
            line = sr.ReadLine();
            if(line != "")
            {
                fileOne.Add(line);
            }
        }
        sr.Close();
        while (sr2.Peek() >= 0)
        {
            line = sr2.ReadLine();
            if (line != "")
            {
                fileTwo.Add(line);
            }
        }
        sr2.Close();
        var t = fileOne.Except(fileTwo);

        StreamWriter sw = new StreamWriter(@"C:\Users\justin\Desktop\texts\First.txt");

        foreach(var z in t)
        {
            sw.WriteLine(z);
        }
        sw.Flush();