Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.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# 动态读取分隔文本文件_C#_Asp.net_.net_C# 4.0 - Fatal编程技术网

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您必须先创建这些子属性。请您用一些代码解释一下,我不明白。我是一个新开发人员@ismav
new 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类型