找到空值时停止读取

时间:2014-11-21 12:00:26

标签: c# csv

我有以下代码:

if (!lines1.Any())
{
    MessageBox.Show("File is empty!", "");
    return;
}

foreach (var line1 in lines1)
{
    var fields1 = line1.Split(new Char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
    date1.Add(fields1[0].Trim('\"'));
    if (fields1.Length > 1)
        data.Add(Convert.ToDouble(fields1[1].Trim('\"'), CultureInfo.InvariantCulture));
}

和包含以下条目的csv文件:

"Date";"Value1";"Value2","Value3"
20.01.2001;35.930;12.341;12,98;

(依此类推)

这样做 - 所以它读取文件并将前两列的值存储在两个单独的列表中。但是现在我可能在" Value2"中有空条目。在末尾。我的代码所做的是 - 他只是跳过空条目并存储" Value2"的值。但我希望他只是停止将数据复制到列表中并继续。怎么办?

当我尝试: if(fields1.Length> 1&&(!(line1.Contains(""))))

它会跳过data.Add行,但每次都是!我只是希望他跳过它,如果一个序列像 2002年1月20日;; 23.098; (...)出现

2 个答案:

答案 0 :(得分:0)

简单,

foreach (var line1 in lines1)
{
     if (string.IsEmptyOrWhiteSpace(line1))
     {
         break;
     }

     var fields1 = line1.Split(
         new Char[] { ';' },
         StringSplitOptions.RemoveEmptyEntries);
     date1.Add(fields1[0].Trim('\"'));
     if (fields1.Length > 1)
     {
         data.Add(
             Convert.ToDouble(fields1[1].Trim('\"'),
             CultureInfo.InvariantCulture));
     }
}

当找到空行时,这会打破循环(停止读取)。

答案 1 :(得分:0)

你不清楚自己想做什么。但据我所知,当你到达第二列为空的单元格的行时,你想停止向两个列表添加值。

如果是这种情况,只需替换

if (fields1.Length > 1)
    data.Add(Convert.ToDouble(fields1[1].Trim('\"'), CultureInfo.InvariantCulture));

if (fields1.Length == 1) break;
data.Add(Convert.ToDouble(fields1[1].Trim('\"'), CultureInfo.InvariantCulture));

[EDIT1]

从其他答案的评论中我想我明白你想做什么。您希望添加所有日期,但只要获得空值,就会停止向列表中添加值。 如果是这种情况,请执行以下操作:

bool shouldBeAddingValues = true;
foreach (var line1 in lines1)
{
    var fields1 = line1.Split(new Char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
    date1.Add(fields1[0].Trim('\"'));
    shouldBeAddingValues &= fields1.Length > 1;
    if (shouldBeAddingValues)
        data.Add(Convert.ToDouble(fields1[1].Trim('\"'), CultureInfo.InvariantCulture));
}

[EDIT2]

从你的编辑中我终于可以看到你想要做什么了。正如Yorye Nathan评论的那样,你应该删除RemoveEmptyEntries。所以代码应该是:

foreach (var line1 in lines1)
{
    var fields1 = line1.Split(new Char[] { ';' });
    date1.Add(fields1[0].Trim('\"'));
    string val = fields1[1].Trim('\"');
    if (val != "")
        data.Add(Convert.ToDouble(val, CultureInfo.InvariantCulture));
}