在C#中仅从CSV中读取一个特定元素

时间:2015-10-09 16:55:15

标签: c# csv

我是C#的新手,我一直在解决问题。我需要从CSV文件(第2行,第4列)中读取一个特定的行/位置,它始终保存我期望的数据。

(如果您很好奇:此CSV文件是一个报告,前三行是标题。相关字段包含日期)

在进行一些研究(以及我的n00b C#技能)之后,这是我(有点)开始的事情:

        dt = new DataTable();
        string[] csvRows = System.IO.File.ReadAllLines(origFilePath);
        dt.Columns.Add(csvRows[0]);

        for (int x = 1; x < 2; x++)
        {
            dt.Rows.Add(csvRows[x]);
        }
        dt.Rows[0][0].ToString(); // must modify [0][0]

事情是,文件可能很大,所以我认为我不需要读取整个文件并将其设置为表对象,然后检索该值。

我确定必须有更好的方法吗?!

有人可以提供建议吗?提前感谢您的帮助。

此致 P上。

4 个答案:

答案 0 :(得分:2)

一衬垫:

var myValue = System.IO.File.ReadLines(origFilePath).Skip(1).First().Split(',')[3];

我确定它不是最佳方式(我甚至没有测试过),但是应该这样做。

不要忘记导入Linq命名空间(using System.Linq;)。

答案 1 :(得分:1)

你正在寻找一种懒惰的方法来获得你需要的东西。懒惰意味着避免读取整个文件以获得正确的行。

using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
    var i = 0;
    string line;
    while ((line = sr.ReadLine()) != null)
    {
        if (i == 4) //4th position = 5th line (3 header lines plus 2 data lines)
        {
            return line.split(',')[3];
        }
        i++;
    }
}

代码部分从这里撕掉: Reading large text files with streams in C#

或者,您可以这样做:

var i = 0;
foreach (string line in File.ReadLines(filepath))
{
    if (i == 4)
    {
        return line.split(',')[3];
    }
    i++;
}

答案 2 :(得分:0)

您可以使用oledb在不打开的情况下读取csv。您可以修改SQL语句以仅检索所需的列。

public class CSVReader
    {

        public DataSet ReadCSVFile(string fullPath, bool headerRow)
        {

            string path = fullPath.Substring(0, fullPath.LastIndexOf("\\") + 1);
            string filename = fullPath.Substring(fullPath.LastIndexOf("\\") + 1);
            DataSet ds = new DataSet();

            try
            {
                if (File.Exists(fullPath))
                {
                    string ConStr = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}" + ";Extended Properties=\"Text;HDR={1};FMT=Delimited\\\"", path, headerRow ? "Yes" : "No");
                    string SQL = string.Format("SELECT * FROM {0}", filename);
                    OleDbDataAdapter adapter = new OleDbDataAdapter(SQL, ConStr);
                    adapter.Fill(ds, "TextFile");
                    ds.Tables[0].TableName = "Table1";
                }
                foreach (DataColumn col in ds.Tables["Table1"].Columns)
                {
                    col.ColumnName = col.ColumnName.Replace(" ", "_");
                }
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            return ds;
        }
    }​

答案 3 :(得分:0)

从CSV文件中读取行,直接移至第15位并获取值。 请参阅下面的C#代码

namespace DBCreateTags
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var reader = new StreamReader(@"T:\test.csv"))
            {
                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine();
                    var values = line.Split(',')[15];

                }
            }
        }

    }
}