在C#中使用csv文件读取时逗号分隔符和列数的问题

时间:2016-05-20 20:17:38

标签: c# visual-studio csv filehelpers

我是一个相当新的编码人员,而我所做的一切我都完全自学了。我尝试读取CSV文件,然后最终将它们输出到SQL服务器。我阅读了很多关于如何执行此操作的内容,并决定使用Visual Studio 2015中的FileHelpers实现它。

我遇到的一个问题是某些数据本身包含逗号(例如:9,500)。我知道很多人建议在数字周围加上引号。但是,我不是输入数字的人。该文件只是以这种方式发送给我,我应该编写代码将其输入到SQL服务器中。 除了引号之外,还有其他方法可以解决该问题吗?此外,我的部分行比其他行短。

ex: Joe, John, Jim, Ben
    35,  42,   35,  60
    A,   B,     C,  D
    40,  50

因此,例如,最后一行没有相同数量的值。它们也不是空的。我已经解决了空值。

它只是不包含它们,当我运行我的代码时,我收到错误 -

  

"行:29列:4。分隔符','找不到

在现场'小时' (记录的字段较少,分隔符错误,或下一个字段必须标记为可选)。"

我将如何解决这些问题?当我删除包含逗号值(如9,500)的行时,当我还删除不完整的行时,我的代码完美无缺。但是,我需要它来处理所有数据。感谢

3 个答案:

答案 0 :(得分:1)

您必须使用

[FieldOptional]

在第3和第4列,如:

[DelimitedRecord(",")]
public class MyRecord
{

   public string Field1;
   public string Field2;
   [FieldOptional]
   public string Field3;
   [FieldOptional]
   public string Field4;

}

答案 1 :(得分:0)

  

除了引号之外,还有其他方法可以解决该问题吗?

是的,您可以使用星号之类的其他内容对逗号空间组合执行字符串替换。然后拆分星号或特殊字符以获取一系列项目。

string input = "Joe, John, Jim, Ben 35, 42, 35, 60, 9,500";
string output = input.Replace(", ", "*");
string[] myArray = output.Split('*');

如果您的值为9,500,则会将该值解释为一个项而不是两个,因为逗号后面没有空格。

但是,您最好将这些值以CSV中的引号括起来。如果您已安装Excel,请添加一行数字,其中一些包含逗号。然后将工作簿另存为CSV,然后在记事本中打开CSV。您会看到带逗号的数字用双引号括起来。这是我刚刚进行的测试的一个例子。

Numbers entered in a row:  9,000, 1, 8, 7, 500, 125,050
CSV text: "9,000",1,8,7,500,"125,050"

我希望能帮到你。祝你好运。

答案 2 :(得分:0)

“短行”问题可以很容易地在软件中解决:

  • 将每一行加载到List(of String)
  • 计算每行的单元格数
  • 获取最大使用的单元数
  • 对于每个“短行”,添加空白单元格,直到它与最大值
  • 匹配

但是,如果人们以数字输入逗号(例如9,500),那么您就会被填充,并且需要请求格式正确的CSV文件。

从问题中的示例数据来看,这是一个“短行”问题。