c#删除字符串中多个字符的智能方法

c#删除字符串中多个字符的智能方法,c#,list,split,C#,List,Split,我的程序读取一个文件,其中有数千行类似下面的内容 “时间戳”、“LiveStandby”、“Total1”、“Total2”、“Total3”等。。 每一行都不一样 按拆分、删除“”以及将值放入列表中的最佳方式是什么 这就是我所拥有的 while ((line = file.ReadLine()) != null) { List<string> title_list = new List<string>(line.Split(',')); } wh

我的程序读取一个文件,其中有数千行类似下面的内容 “时间戳”、“LiveStandby”、“Total1”、“Total2”、“Total3”等。。 每一行都不一样 按拆分、删除“”以及将值放入列表中的最佳方式是什么

这就是我所拥有的

 while ((line = file.ReadLine()) != null)
  {
     List<string> title_list = new List<string>(line.Split(',')); 
  }
while((line=file.ReadLine())!=null)
{
List title_List=新列表(line.Split(',');
}

上面的步骤仍然缺少删除引号。我可以做每一个,但这有点挫败了列表的目的,只在一行中分割。做这件事的最佳和明智的方法是什么?

我认为最好的方法是使用一个解析库,例如

具体地说,在您的情况下,这将是使用FileHelpers库的解决方案:

定义描述记录结构的类:

[DelimitedRecord(",")]
public class MyDataRecord
{
    [FieldQuoted('"')]
    public string TimeStamp;
    [FieldQuoted('"')]
    public string LiveStandby;
    [FieldQuoted('"')]
    public string Total1;
    [FieldQuoted('"')]
    public string Total2;
    [FieldQuoted('"')]
    public string Total3;
}
使用以下代码分析整个文件:

var csvEngine = new FileHelperEngine<MyDataRecord>(Encoding.UTF8)
    { 
        Options = { IgnoreFirstLines = 1, IgnoreEmptyLines = true }
    };

var parsedItems = csvEngine.ReadFile(@"D:\myfile.csv");
var csvEngine=new FileHelperEngine(Encoding.UTF8)
{ 
选项={IgnoreFirstLines=1,IgnoreEmptyLines=true}
};
var parsedItems=csvEngine.ReadFile(@“D:\myfile.csv”);

请注意,此代码仅用于说明,我没有编译/运行它。但是,该库的使用非常简单,网站上有很好的示例和文档。

我将对此稍作澄清。如果您有一个具有可预测格式的用户格式化文件(即用户已从EXCEL或类似程序生成数据),则最好使用经过良好测试的现有解析器

以下场景只是手动解析会遇到问题的几个示例:

"column 1", 2, 0104400, $1,300, "This is an interestion question, he said"
。。还有更多关于转义、文件格式等的内容,这可能会让你自己头疼

如果您这样做了,那么请确保您得到了一个可以容忍每行列差异的方法,因为它可以产生差异

另一方面,如果您知道系统生成的文件中常见的数据中的内容,那么使用CSV解析器将导致比它们解决的问题更多的问题。例如,我曾经处理过这样的场景:第一部分是固定的,可以是强类型的,但是一行中有以下部分不是固定的。如果您在固定宽度的场景中从遗留数据库解析平面文件数据,也可能发生这种情况。csv解决方案会做出我们不想要的假设,并且在许多情况下都不是正确的解决方案

如果是这种情况,并且您只想在逗号上拆分后去掉引号,那么尝试一下linq。这也可以扩展为替换您担心的特定字符

line.Split(',').Select(i => i.Replace("\"", "")).ToArray()

希望这能消除所有相互矛盾的建议。

保持这样的简单应该会奏效:

List<string> strings = new List<string>();
while ((line = file.ReadLine()) != null) 
    string.AddRange(line.Replace("\"").split(',').AsEnumerable());
List strings=newlist();
而((line=file.ReadLine())!=null)
string.AddRange(line.Replace(“\”).split(“,”).AsEnumerable());
您可以使用该功能

string line = "\"Timestamp\",\"LiveStandby\",\"Total1\",\"Total2\",\"Total3\"";

var list = new List<String>(Array.ConvertAll(line.Split(','), x=> x.Replace("\"","")));
string line=“\“Timestamp\”、\“LiveStandby\”、\“Total1\”、\“Total2\”、\“Total3\”;
var list=新列表(Array.ConvertAll(line.Split('),'),x=>x.Replace(“\”,”);

首先执行替换,然后拆分到列表中。这是带Replace的代码

while ((line = file.ReadLine()) != null)   
{      
  List<string> title_list = new List<string>(line.Replace("\"", "").Split(','));    
}
while((line=file.ReadLine())!=null)
{      
列表标题\列表=新列表(行。替换(\“”,“”)。拆分(',');
}

不过,您需要一个变量来保存所有列表,所以请考虑使用AddRange()。

两个词:regularexpressions@Al-我应该在哪里应用这个?我不认为我可以过载分割?”一些人在遇到问题时,会想“我知道,我会使用正则表达式。”现在他们有两个问题。“-杰米Zawinski@John您能否澄清这是用户生成的文件还是系统生成的文件?很明显,有很多方法可以做到这一点(即有些人只有一把锤子,所有东西看起来都像钉子)。如果它是一个用户生成的文件,那么CSV解析器肯定是一个不错的选择。像Cheeso和mine这样更简单的解决方案对于系统生成的数据非常有用,因为您只想删除非常特定的字符。请澄清。@就CSV文件规范而言,这些不是标题。他们的存在或不存在并不是这里真正的问题;重要的一点是字段中是否包含转义逗号或引号。感谢Andrew,但我假设他知道他在做什么,以及如何扩展此字段以删除他想要删除的特定字符。另一方面,我可以写出我的CSV解析器助手,但他不会学到任何东西,是吗?使用cv解析器是一个有效的建议,但不能保证是他正在寻找的答案。好的,伙计们。更新答案以考虑此假设。事实上,我假设这个问题是字面意义上的,有些人假设这个问题是针对一个他在问题中没有具体说明的场景。两者都可能是对的。。。考虑清楚了。在他的问题中没有提到CSV。@naspinski-ToEnumerable不可用?我遗漏了什么?我有个系统。仍然不可用。我在.NET3.5上。如果字符串中有逗号怎么办?在这种情况下,这会失败,不是吗?是的,但您也可以执行不同的拆分:。拆分(新字符串[]{“\”,\”},StringSplitOptions.IgnoreEmptyEntries)title\u list.AddRange(line.Replace(“\”,”).split(“,”).AsEnumerable();OP从未真正说过这是一个普通的CSV文件。他确实说过每一行都不同。这可能意味着第1行有10个字符串,第2行有20个字符串,等等@hatchet虽然OP确实没有提到“CSV”,但呈现的案例看起来非常类似于CSV文件。“每一行都不同”也可能意味着每一行都有新的值或
”,“
不一定要对齐,以便进一步分析easily@Andrew:我在这里看不到任何正则表达式解决方案。仅替换/拆分真正基本且不好的解决方案。正则表达式可以做得更好,但速度很慢。