c#如何读取CSV文件

2024-12-25 20:00:23
推荐回答(2个)
回答1:

/// 
/// 将DataTable中数据写入到CSV文件中
/// 

/// 提供保存数据的DataTable
/// CSV的文件路径
public static bool SaveCSV(DataTable dt, string fullPath)
{
try
{
FileInfo fi = new FileInfo(fullPath);
if (!fi.Directory.Exists)
{
fi.Directory.Create();
}
FileStream fs = new FileStream(fullPath, System.IO.FileMode.Create, System.IO.FileAccess.Write);
//StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default);
StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8);
string data = "";
//写出列名称
for (int i = 0; i < dt.Columns.Count; i++)
{
data += "\"" + dt.Columns[i].ColumnName.ToString() + "\"";
if (i < dt.Columns.Count - 1)
{
data += ",";
}
}
sw.WriteLine(data);
//写出各行数据
for (int i = 0; i < dt.Rows.Count; i++)
{
data = "";
for (int j = 0; j < dt.Columns.Count; j++)
{
string str = dt.Rows[i][j].ToString();
str = string.Format("\"{0}\"", str);
data += str;
if (j < dt.Columns.Count - 1)
{
data += ",";
}
}
sw.WriteLine(data);
}
sw.Close();
fs.Close();
return true;
}
catch
{
return false;
}
}
/// 
/// 读取CSV文件到DataTable中
/// 

/// CSV的文件路径
/// 
public static DataTable ReadCSV(string filePath)
{
DataTable dt = new DataTable();
int lineNumber = 0;
using (CsvFileReader reader = new CsvFileReader(filePath))
{
CsvRow row = new CsvRow();
while (reader.ReadRow(row))
{

if (0 == lineNumber)
{
foreach (string s in row)
{
dt.Columns.Add(s.Replace("\"", ""));
}
}
else
{
int index = 0;
DataRow dr = dt.NewRow();
foreach (string s in row)
{
dr[index] = s.Replace("\"", "");
index++;
}
dt.Rows.Add(dr);
}
lineNumber++;
}
}
return dt;
}

public class CsvRow : List
{
public string LineText { get; set; }
}
public class CsvFileReader : StreamReader
{
public CsvFileReader(Stream stream)
            : base(stream)
        {
}

public CsvFileReader(string filename)
            : base(filename)
        {
}

///   
/// Reads a row of data from a CSV file  
/// 
  
///   
///   
public bool ReadRow(CsvRow row)
{
row.LineText = ReadLine();
if (String.IsNullOrEmpty(row.LineText))
return false;

int pos = 0;
int rows = 0;

while (pos < row.LineText.Length)
{
string value;

// Special handling for quoted field  
if (row.LineText[pos] == '"')
{
// Skip initial quote  
pos++;

// Parse quoted value  
int start = pos;
while (pos < row.LineText.Length)
{
// Test for quote character  
if (row.LineText[pos] == '"')
{
// Found one  
pos++;

// If two quotes together, keep one  
// Otherwise, indicates end of value  
if (pos >= row.LineText.Length || row.LineText[pos] != '"')
{
pos--;
break;
}
}
pos++;
}
value = row.LineText.Substring(start, pos - start);
value = value.Replace("\"\"", "\"");
}
else
{
// Parse unquoted value  
int start = pos;
while (pos < row.LineText.Length && row.LineText[pos] != ',')
pos++;
value = row.LineText.Substring(start, pos - start);
}

// Add field to list  
if (rows < row.Count)
row[rows] = value;
else
row.Add(value);
rows++;

// Eat up to and including next comma  
while (pos < row.LineText.Length && row.LineText[pos] != ',')
pos++;
if (pos < row.LineText.Length)
pos++;
}
// Delete any unused items  
while (row.Count > rows)
row.RemoveAt(rows);

// Return true if any columns read  
return (row.Count > 0);
}
}

回答2:

网页链接 参考一下