我有以下代码:
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; (...)出现
答案 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));
}