C# 动态读取分隔文本文件
我想根据标题动态读取文本文件。考虑这样一个例子C# 动态读取分隔文本文件,c#,asp.net,.net,c#-4.0,C#,Asp.net,.net,C# 4.0,我想根据标题动态读取文本文件。考虑这样一个例子 name|email|phone|othername|company john|john@example.com|1234||example doe|doe@example.com||pin jane||98485| 对于以下记录,要像这样读取的值 name email phone othername company john john@example.com 1234 exam
name|email|phone|othername|company
john|john@example.com|1234||example
doe|doe@example.com||pin
jane||98485|
对于以下记录,要像这样读取的值
name email phone othername company
john john@example.com 1234 example
doe doe@example.com pin
jane 98485
我试过用这个
使用(StreamReader sr=new StreamReader(new MemoryStream(textFile)))
{
而(sr.Peek()>=0)
{
string line=sr.ReadLine();//使用ReadLine方法读取文本文件。
string[]strlist=line.Split(“|”);//使用string.Split()方法拆分字符串。
Obj Obj=新Obj();
obj.Name=strlist[0].ToString();
obj.Email=strlist[1].ToString();
obj.Phone=strlist[2].ToString();
obj.othername=strlist[3].ToString();
obj.company=strlist[4].ToString();
}
}
如果所有分隔符都被精确地放置,那么上面的代码就可以工作,但是当像上面那样动态地给出分隔符时就不工作了。有什么可能的解决方案吗?当您像
string[]strlist=line.split(“|”)那样拆分行时代码>您可能会得到不想要的结果。
例如:jane | | | 98485 |
只生成4个元素的数组,您可以在线查看
您应该在生成数组后检查数组strList
,并使用类似于测量大小的方法进行检查。
由于你没有给出关于这个问题的明确细节,我无法给出更具体的答案。当你像string[]strlist=line.split(“|”)那样拆分行时代码>您可能会得到不想要的结果。
例如:jane | | | 98485 |
只生成4个元素的数组,您可以在线查看
您应该在生成数组后检查数组strList
,并使用类似于测量大小的方法进行检查。
由于您没有给出关于这个问题的明确细节,我无法给出更具体的答案。如果您对此有任何控制,您应该使用更好的序列化技术,或者至少使用可以处理这种格式的csv解析器。但是,如果要使用string.Split
,还可以利用
返回序列或默认值中指定索引处的元素
如果索引超出范围,则返回值
给定的
public class Data
{
public string Name { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public string OtherName { get; set; }
public string Company { get; set; }
}
用法
var results = File
.ReadLines(SomeFileName) // stream the lines from a file
.Skip(1) // skip the header
.Select(line => line.Split('|')) // split on pipe
.Select(items => new Data() // populate some funky class
{
Name = items.ElementAtOrDefault(0),
Email = items.ElementAtOrDefault(1),
Phone = items.ElementAtOrDefault(2),
OtherName = items.ElementAtOrDefault(3),
Company = items.ElementAtOrDefault(4)
});
foreach (var result in results)
Console.WriteLine($"{result.Name}, {result.Email}, {result.Phone}, {result.OtherName}, {result.Company}");
输出
john, john@example.com, 1234, , example
doe, doe@example.com, , pin,
jane, , 98485, ,
如果您对此有任何控制权,那么应该使用更好的序列化技术,或者至少使用能够处理这种格式的csv解析器。但是,如果要使用string.Split
,还可以利用
返回序列或默认值中指定索引处的元素
如果索引超出范围,则返回值
给定的
public class Data
{
public string Name { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public string OtherName { get; set; }
public string Company { get; set; }
}
用法
var results = File
.ReadLines(SomeFileName) // stream the lines from a file
.Skip(1) // skip the header
.Select(line => line.Split('|')) // split on pipe
.Select(items => new Data() // populate some funky class
{
Name = items.ElementAtOrDefault(0),
Email = items.ElementAtOrDefault(1),
Phone = items.ElementAtOrDefault(2),
OtherName = items.ElementAtOrDefault(3),
Company = items.ElementAtOrDefault(4)
});
foreach (var result in results)
Console.WriteLine($"{result.Name}, {result.Email}, {result.Phone}, {result.OtherName}, {result.Company}");
输出
john, john@example.com, 1234, , example
doe, doe@example.com, , pin,
jane, , 98485, ,
什么是“不工作”,发生了什么,你所说的“动态”是什么意思?你的意思是列名可以不同,并且你要查找的数据可以位于另一个位置吗?不,我的意思是,如果给定的文本文件只有两列的数据,它就不起作用。如果文本文件只有两列,那么它们将不会被读取C#4.0?真的吗?在使用特定索引之前,请检查数组长度,以确保索引没有超出范围异常。@VDWWD,但我将获得不同数量的数据。只有标题是固定的。什么是“不工作”,发生了什么,你所说的“动态”是什么意思?你的意思是列名可以不同,并且你要查找的数据可以位于另一个位置吗?不,我的意思是,如果给定的文本文件只有两列的数据,它就不起作用。如果文本文件只有两列,那么它们将不会被读取C#4.0?真的吗?在使用特定索引之前,请检查数组长度,以确保索引没有超出范围异常。@VDWWD,但我将获得不同数量的数据。只有标题将被修复。请编辑问题,以便更好地理解如果这是问题,您是否尝试过?如果你告诉我们,当你说你的代码不工作时,你遇到了什么样的问题,这将是非常有帮助的。编辑这个问题,这样你就可以更好地理解如果这是问题,你试过了吗?如果你告诉我们当你说你的代码不工作时你遇到了什么样的问题,这将是完全有帮助的。如果这是一个独立的对象,比如public class Data{public Details Details{get;set;}public OtherDetails OtherDetails{get;set;},该怎么办
这行得通吗?@ismav您必须先创建这些子属性。请您用一些代码解释一下,我不明白。我是一个新开发人员@ismavnew Data(){details=new details{Name=items.ElementAtOrDefault(0)},
假设有一个datetime类型的字段如何处理它?像这样DOB=items.ElementAtOrDefault(11)
其中DOB是datetime类型的,如果它作为一个单独的对象存在,比如公共类数据呢{public-Details-Details{get;set;}public-OtherDetails-OtherDetails{get;set;}}
这行吗?@ismav你必须先创建那些子属性你能不能用一些代码解释一下,我搞不懂。我是一个新开发人员@ismav新数据(){Details=new Details{Name=items.ElementAtOrDefault(0)},…
假设有一个datetime类型的字段,如何处理它?像这样DOB=items.ElementAtOrDefault(11)
其中DOB是datetime类型