3

我的程序读取了一个文件,该文件在“时间戳”、“LiveStandby”、“Total1”、“Total2”、“Total3”等下面有数千行类似的内容。每一行都是不同的 分割的最佳方法是什么, 并删除 "" 并将值放入列表中

这就是我所拥有的

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

上面的步骤仍然缺少删除引号。我可以做 foreach 但这有点违背了将 List 和 Split 放在一行中的目的。最好和最聪明的方法是什么?

4

5 回答 5

4

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

具体来说,在您的情况下,这将是使用 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");

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

于 2012-04-26T20:44:39.187 回答
2

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

像下面这样的场景只是手动解析会遇到问题的几个例子:

"column 1", 2, 0104400, $1,300, "This is an interestion question, he said"

..还有更多的转义、文件格式等可能会让你自己头疼。

如果你这样做,那么确保你得到一个可以容忍每行列的差异,因为它可以产生影响。

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

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

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

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

于 2012-04-26T20:46:12.227 回答
2

像这样保持简单应该可以:

List<string> strings = new List<string>();
while ((line = file.ReadLine()) != null) 
    string.AddRange(line.Replace("\"").split(',').AsEnumerable());
于 2012-04-26T20:46:55.403 回答
1

您可以使用该Array.ConvertAll()功能。

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

var list = new List<String>(Array.ConvertAll(line.Split(','), x=> x.Replace("\"","")));
于 2012-04-26T20:53:23.500 回答
0

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

while ((line = file.ReadLine()) != null)   
{      
  List<string> title_list = new List<string>(line.Replace("\"", "").Split(','));    
}

虽然,您将需要一个变量来保存所有列表,因此请考虑使用 AddRange()。

于 2012-04-26T20:56:14.870 回答