最后一行被切断了

时间:2017-10-18 06:37:05

标签: c# csv xamarin.android

我不知道为什么在最后一个csv行中最后4列被切断

如果我简要介绍一下这个过程,也许这会有所帮助。

最初,应用程序读入一个csv,它在ListView中输出。可以选择单个ListItems。对于每个项目,可以停止带有日期的时间,然后将这些时间写入csv。这适用于我覆盖整个csv。

重新启动应用后,仅显示"未处理的异常"因为被覆盖的csv不再与原始csv匹配。 所有记录都是正常的,除了最后一个,并且有最后4个值:

_Dum "+", "+" _Vo "+", "+" _Bi "+", "+" _Da "

builder.AppendLine( "_Dum" + "," + "_Vo" + "," + "_Bi" + "," + "_Da" + "\r");

//Add Data

foreach (var data in varModule.List)
{
builder.AppendLine( data._Dum + ",");

if (data._Stu == "B" || data._Stu == "E")
{
builder.AppendLine(data._Vo + "," + data._Bi + "," + data._Dau);
};

//Line Break

 builder.AppendLine("\r\n\n");
 }
using (StreamWriter sw = new StreamWriter(csvFilePath))

{
 sw.WriteLine(builder);
 sw.Flush();
}

注意:如果我没有\r\n\n和双||,那么最后的csv行会被删除。

1 个答案:

答案 0 :(得分:0)

您的程序似乎没有写入您需要的数据。您可能期望以下输出

  

_Dum,_Vo,_Bi,_Da<NewLine>

     

<ValueOf_Dum>,<ValueOf_Vo>,<ValueOf_Bi>,<ValueOf_Da><NewLine>

请注意,我特意将<NewLine>添加到输出中。 <NewLine>代表换行符,取决于您的操作系统是"\n"(在Unix系统上)或"\r\n"(在Windows系统上)。在.NET中还有Environment.NewLine,它返回特定于平台的新行字符。请注意,没有CSV“标准”,因此您可以选择要使用的新行字符。看来你不清楚这一点,所以你首先必须做出这个决定。

您需要考虑的下一件事是StringBuilder.AppendStringBuilder.AppendLine之间的区别。 Append只是在字符串末尾添加指定的文字,而AppendLine添加文字,后跟Environment.NewLine返回的字符。

在您的代码中,您始终使用AppendLine,这可能不是您想要的,因为您显然想构建行并将它们作为一个整体添加。按照这种方式,您可以在某些值之间一致地添加换行符,CSV表示新记录的开头。

您不仅无意中将新行字符添加到文件中,而且您手动添加的新行字符也不一致。在标题行中,您使用"\r"(在Unix中在Windows中不正常)。稍后您使用"\r\n\n"(甚至后跟AppendLine添加的新行),这在Unix中不起作用(因为开始时为"\r")或在Windows中(因为最后没有前面"\n"的{​​{1}}。

您的下一个问题是代码的这一部分:

"\r"

if (data._Stu == "B" || data._Stu == "E") { builder.AppendLine(data._Vo + "," + data._Bi + "," + data._Dau); }; _Vo_Bi时,您正在为_Dau_Stu"B"添加值。当"E"有任何其他价值时你会怎么做?没有!这意味着您在那里生成一个不完整的记录,这是您描述的问题的最可能原因。您需要决定在else案例中应该发生什么,并将其合并到您的程序中。

通常,您似乎无法完全了解程序的预期流程,CSV格式以及您在代码中使用的说明。要解决您的问题,您需要执行以下步骤:

  1. 清楚地了解所需的输出以及程序必须看起来如何生成输出。
  2. 了解CSV格式及其中换行符的重要性。
  3. 确定您要使用的新行格式(_Stu"\r\n""\n"),并在整个程序中始终如一地使用它。
  4. 使用Environment.NewLine只想添加文字,Append如果希望添加的文字后跟AppendLine
  5. 清除Environment.NewLine不是Stu"B"时应该发生的事情,并将此案例添加到您的计划中。
  6. 在调试器中逐步执行您的程序,以确认它正是您正在执行的操作。