在C#中使用System.IO.File.ReadAllLines(fil)时如何跳过第一行?

5

我有一个像这样的语句:

string[] lines = System.IO.File.ReadAllLines(file);
foreach (string line in lines)
{
      ...
}

由于底层的 .csv 文件中有标题,导致我出现了错误。我想跳过这一行,但是当我使用以下代码时:

string [] lines = System.IO.File.ReadLines(file).Skip(1).ToArray();

当我尝试使用Skip(1)时,发现String无法使用。同样的情况也出现在我尝试使用以下代码时:

string[] lines = System.IO.File.ReadAllLines(file);
lines = lines.Skip(1).ToArray();

产生相同的错误。

有人有任何想法吗?我能否调整Foreach循环,使其变为一个For循环,在其中忽略第一行?

问候,

编辑

我目前使用的代码是:

    string[] lines = System.IO.File.ReadAllLines(file);
    lines = lines.Skip(1).ToArray();

   foreach (string line in lines)
    {
            var cols = line.Split(';');
            if (cols.Length == 1)
                continue;
            DataRow dr = tbl.NewRow();
            dr[0] = file;
            for (int cIndex = 1; cIndex + 1 < tbl.Columns.Count; cIndex++)
            {
                dr[cIndex + 1] = cols[cIndex];
            }
    }
    System.Text.StringBuilder b = new System.Text.StringBuilder();
    foreach (System.Data.DataRow r in tbl.Rows)
    {
        foreach (System.Data.DataColumn c in tbl.Columns)
        {
            b.Append(c.ColumnName.ToString() + ":" + r[c.ColumnName].ToString());
        }
    }
    MessageBox.Show(b.ToString());
    return tbl;

在这里,b.ToString() 返回了 Nothing(即空值)。之前当我使用 GetAllLines() 时,它返回的是:

fileName:fileNameStore:storeQuantity:quantityfileName:fileNameStore:1000Quantity:30

类似这样的一串字符。

我的想法是,可能我只导入了一个很长的字符串,所以当我跳过第一行时,它就变成了 NULL。

但这是我第一次编写 C# 代码,所以我在解决问题方面遇到了一些困难。


1
为什么不直接使用 StreamReader 并调用 reader.ReadLine() 来忽略第一行,然后处理每一行呢? - mrogal.ski
5
你确定已经添加了对 System.Linq 命名空间的引用吗? - Selman Genç
不要询问您对错误的解释,而是研究实际的错误。 - CodeCaster
System.IO.File.ReadLines(file) 不会返回一个字符串。 - Jeroen van Langen
5个回答

19

您现在的算法没有问题:

string[] lines = System.IO.File.ReadAllLines(file);
lines = lines.Skip(1).ToArray();

请确保您导入了下面的命名空间。

using System.Linq;

使用这种技术,我最近发现我的表将返回为NULL。 以前它是一个"完整"的表格,第一行是标题。 有任何想法吗? - Cenderze
@Cenderze 你能否更新你的回答并加上错误日志? - Ousmane D.
我没有收到任何错误信息,但是我用来创建数据表的代码返回了一个空表。我可以在几分钟内编辑我使用的代码。感谢您审查此问题。 - Cenderze
@Cenderze 当然,没问题。 - Ousmane D.
让我们在聊天中继续这个讨论 - Ousmane D.
显示剩余2条评论

7
我建议使用 File.ReadLines() 替代 File.ReadAllLines()。因为它是惰性加载文件,不会将整个文件读入内存,所以不必使用 .ToArray().ToList(),这些方法会将整个文件保留在内存中。这样可以流式处理数据。
foreach(var line in File.ReadLines(file).Skip(1))
{

}

能胜任这份工作...


4

好的,那么我会用一些代码示例和更多描述性的解释来扩展我的评论。我建议您使用StreamReader

using ( StreamReader reader = new StreamReader(File.OpenRead(filePath)) )
{

现在忽略第一行:
    reader.ReadLine();

并继续执行您的阅读逻辑:
    string line = string.Empty;
    while ( ( line =  reader.ReadLine() ) != null )
    {
        // your logic
    }
}

如果您需要将这些行“打包”成数组,您只需在开始时创建一个List<string>,并在您的逻辑中使用List<string>.Add(string)方法,其中line是您的字符串参数。然后,您可以使用List<string>.ToArray()方法返回行的数组。


3
这也可以通过单行代码实现,例如:
var lines = File.ReadAllLines(csv_file_path).Skip(1).Select(a => a.Split(';',',')).ToList();

感谢回复。这个单行代码非常简洁! - Cenderze

1
你可以这样做,虽然不太美观但是能够运行 :)
string[] lines = System.IO.File.ReadAllLines(file);
bool first = true;
foreach (string line in lines)
{
    if(!first)
    {
       ...
    }
    first = false;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接