我是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上。
答案 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];
}
}
}
}
}