c#从csv中删除行
我有两个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
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();