c# 怎么读取和导出csv文件??

wuernan 2009-02-12 03:45:46
我希望读取进来的csv文件,能作为datasource像数据表一样显示在grid的控件里,因为我要对csv中的表格,字段进行操作和修改内容,我参照了几篇,代码如下:

DataSet myDataSet = new DataSet();
string strConnCSV = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\appFileUpdate;Extended Properties='TEXT;HDR=Yes;FMT=Delimited;'";
System.Data.OleDb.OleDbConnection objConn = new OleDbConnection(strConnCSV);
string strSql = "SELECT 宝贝名称,宝贝类目,店铺类目 FROM " + openFileDialog1.FileName;
objConn.Open();
System.Data.OleDb.OleDbDataAdapter odbcCSVDataAdapter = new OleDbDataAdapter(strSql, strConnCSV);
odbcCSVDataAdapter.Fill(myDataSet);
dataGridView1.DataSource = myDataSet.Tables[0];
这样写的结果显示在表格中是乱码,求各位怎么解决,csv文件中有中文!(是不是字串写的有问题?)

另外,修改完数据我想把数据再导出为csv保存,如何做较好?

感谢
...全文
7603 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
yy_youth 2011-04-11
  • 打赏
  • 举报
回复
顶起,好贴。我试试能用不
dreaminglove 2011-01-07
  • 打赏
  • 举报
回复
来学习的
相反了我做的是:怎么读取csv格式文件里面的数据呢???怎么可以判断csv的每一列与库表的的字段对应呢?
txm294115862 2011-01-04
  • 打赏
  • 举报
回复
另存为UTF-8
dyshadow 2009-02-13
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wuernan 的回复:]
也就是说 我不知道该怎样读取 unicode 编码的csv ,读进来就乱码,望指教
[/Quote]
文件打开的时候更改编码选项:


FileInfo fileToOpen = new FileInfo(@"C:\input.bin");

FileStream fs = fileToOpen.OpenRead();

StreamReader sr = new StreamReader(fs, Encoding.Unicode);//<---------------

更改ENCODING就好
wuernan 2009-02-13
  • 打赏
  • 举报
回复
也就是说 我不知道该怎样读取 unicode 编码的csv ,读进来就乱码,望指教
alan001 2009-02-13
  • 打赏
  • 举报
回复
UP
nzhrwf 2009-02-13
  • 打赏
  • 举报
回复
/// <summary>
/// 动态生成XSL,并写入XML流
/// </summary>
/// <param name="writer">XML流</param>
/// <param name="headers">表头数组</param>
/// <param name="fields">字段数组</param>
/// <param name="exportFormat">导出文件的格式</param>
private static void CreateStylesheet(XmlTextWriter writer, string[] headers, string[] fields, ExportFormat exportFormat)
{
string ns = "http://www.w3.org/1999/XSL/Transform";
writer.Formatting = Formatting.Indented;
writer.WriteStartDocument();
writer.WriteStartElement("xsl", "stylesheet", ns);
writer.WriteAttributeString("version", "1.0");
writer.WriteStartElement("xsl:output");
writer.WriteAttributeString("method", "text");
writer.WriteAttributeString("version", "4.0");
writer.WriteEndElement();

// xsl-template
writer.WriteStartElement("xsl:template");
writer.WriteAttributeString("match", "/");

// xsl:value-of for headers
for (int i = 0; i < headers.Length; i++)
{
writer.WriteString("\"");
writer.WriteStartElement("xsl:value-of");
writer.WriteAttributeString("select", "'" + headers[i] + "'");
writer.WriteEndElement(); // xsl:value-of
writer.WriteString("\"");
if (i != fields.Length - 1) writer.WriteString((exportFormat == ExportFormat.CSV) ? "," : " ");
}
// xsl:for-each
writer.WriteStartElement("xsl:for-each");
writer.WriteAttributeString("select", "Export/Values");
writer.WriteString("\r\n");

// xsl:value-of for data fields
for (int i = 0; i < fields.Length; i++)
{
writer.WriteString("\"");
writer.WriteStartElement("xsl:value-of");
writer.WriteAttributeString("select", fields[i]);
writer.WriteEndElement(); // xsl:value-of
writer.WriteString("\"");
if (i != fields.Length - 1) writer.WriteString((exportFormat == ExportFormat.CSV) ? "," : " ");
}

writer.WriteEndElement(); // xsl:for-each
writer.WriteEndElement(); // xsl-template
writer.WriteEndElement(); // xsl:stylesheet
}
/// <summary>
/// 导出数据源的数据
/// </summary>
/// <param name="dt">数据源</param>
/// <param name="columnIndexList">导出的列索引数组</param>
/// <param name="exportFormat">导出文件的格式</param>
/// <param name="fileName">输出文件名</param>
/// <param name="encoding">编码</param>
public static void Export(DataTable dt, int[] columnIndexList, ExportFormat exportFormat, string fileName, Encoding encoding)
{
DataSet dsExport = new DataSet("Export");
DataTable dtExport = dt.Copy();

dtExport.TableName = "Values";
dsExport.Tables.Add(dtExport);

string[] headers = new string[columnIndexList.Length];
string[] fields = new string[columnIndexList.Length];

for (int i = 0; i < columnIndexList.Length; i++)
{
headers[i] = dtExport.Columns[columnIndexList[i]].ColumnName;
fields[i] = ReplaceSpecialChars(dtExport.Columns[columnIndexList[i]].ColumnName);
}
Export(dsExport, headers, fields, exportFormat, fileName, encoding);
}
/// <summary>
/// 导出数据源的数据
/// </summary>
/// <param name="dt">数据源</param>
/// <param name="columnIndexList">导出的列索引数组</param>
/// <param name="headers">导出的列标题数组</param>
/// <param name="exportFormat">导出文件的格式</param>
/// <param name="fileName">输出文件名</param>
/// <param name="encoding">编码</param>
public static void Export(DataTable dt, int[] columnIndexList, string[] headers, ExportFormat exportFormat, string fileName, Encoding encoding)
{
DataSet dsExport = new DataSet("Export");
DataTable dtExport = dt.Copy();
dtExport.TableName = "Values";
dsExport.Tables.Add(dtExport);
string[] fields = new string[columnIndexList.Length];
for (int i = 0; i < columnIndexList.Length; i++)
{
fields[i] = ReplaceSpecialChars(dtExport.Columns[columnIndexList[i]].ColumnName);
}
Export(dsExport, headers, fields, exportFormat, fileName, encoding);
}
}
}






调用
case "ExportExcel":
webprint.FileSave.Export(dt,ExportFormat.XLS,"excel",Encoding.GetEncoding("GB2312"));
break;
case "ExportCsv":
webprint.FileSave.Export(dt, ExportFormat.CSV, "excel", Encoding.GetEncoding("GB2312"));
break;
case "ExportWord":
webprint.FileSave.Export(dt, ExportFormat.DOC, "word", Encoding.GetEncoding("GB2312"));
break;
case "ExportText":
webprint.FileSave.Export(dt, ExportFormat.TXT, "text", Encoding.GetEncoding("GB2312"));
break;
nzhrwf 2009-02-13
  • 打赏
  • 举报
回复

using System.Xml.Xsl;
using System.Web.Security;
using System.Configuration;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls.WebParts;


namespace webprint
{
public enum ExportFormat
{
/// <summary>
/// XLS
/// </summary>
XLS,
/// <summary>
/// CSV
/// </summary>
CSV,
/// <summary>
/// DOC
/// </summary>
DOC,
/// <summary>
/// TXT
/// </summary>
TXT
}
public class FileSave
{
/// <summary>
/// 替换特殊字符
/// </summary>
/// <param name="input">字符串</param>
/// <returns></returns>
public static string ReplaceSpecialChars(string input)
{
// space -> _x0020_
// % -> _x0025_
// # -> _x0023_
// & -> _x0026_
// / -> _x002F_
input = input.Replace(" ", "_x0020_")
.Replace("%", "_x0025_")
.Replace("#", "_x0023_")
.Replace("&", "_x0026_")
.Replace("/", "_x002F_");
return input;
}
/// <summary>
/// 导数据源的数据
/// </summary>
/// <param name="dt">数据源</param>
/// <param name="exportFormat">导出文件的格式</param>
/// <param name="fileName">输出文件名</param>
/// <param name="encoding">编码</param>
public static void Export(DataTable dt, ExportFormat exportFormat, string fileName, Encoding encoding)
{
DataSet dsExport = new DataSet("Export");
DataTable dtExport = dt.Copy();

dtExport.TableName = "Values";
dsExport.Tables.Add(dtExport);

string[] headers = new string[dtExport.Columns.Count];
string[] fields = new string[dtExport.Columns.Count];

for (int i = 0; i < dtExport.Columns.Count; i++)
{
headers[i] = dtExport.Columns[i].ColumnName;
fields[i] = ReplaceSpecialChars(dtExport.Columns[i].ColumnName);
}
Export(dsExport, headers, fields, exportFormat, fileName, encoding);
}
/// <summary>
/// 导出SmartGridView的数据源的数据
/// </summary>
/// <param name="ds">数据源</param>
/// <param name="headers">导出的表头数组</param>
/// <param name="fields">导出的字段数组</param>
/// <param name="exportFormat">导出文件的格式</param>
/// <param name="fileName">输出文件名</param>
/// <param name="encoding">编码</param>
private static void Export(DataSet ds, string[] headers, string[] fields, ExportFormat exportFormat, string fileName, Encoding encoding)
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Buffer = true;
HttpContext.Current.Response.ContentType = String.Format("text/{0}", exportFormat.ToString().ToLower());
HttpContext.Current.Response.AddHeader("content-disposition", String.Format("attachment;filename={0}.{1}", fileName, exportFormat.ToString().ToLower()));
HttpContext.Current.Response.ContentEncoding = encoding;

MemoryStream stream = new MemoryStream();
XmlTextWriter writer = new XmlTextWriter(stream, encoding);

CreateStylesheet(writer, headers, fields, exportFormat);
writer.Flush();
stream.Seek(0, SeekOrigin.Begin);

XmlDataDocument xmlDoc = new XmlDataDocument(ds);
XslCompiledTransform xslTran = new XslCompiledTransform();
xslTran.Load(new XmlTextReader(stream));

System.IO.StringWriter sw = new System.IO.StringWriter();
xslTran.Transform(xmlDoc, null, sw);

HttpContext.Current.Response.Write(sw.ToString());
sw.Close();
writer.Close();
stream.Close();
HttpContext.Current.Response.End();
}
wuernan 2009-02-13
  • 打赏
  • 举报
回复
haode ,xie xie 我好好试试,

实际上我现在手边用得是taobao的csv,unicode编码的,中间分割符号是 tab 键
wuernan 2009-02-13
  • 打赏
  • 举报
回复
xiexie ,,,,,,,,我解决了,准备结贴
qinhl99 2009-02-12
  • 打赏
  • 举报
回复
上面的代码是我经过测试的,也是正在用的,一定没有问题!
qinhl99 2009-02-12
  • 打赏
  • 举报
回复
上面的代码是我经过测试的,也是正在用的,一定没有问题!
qinhl99 2009-02-12
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Data;

namespace Utility
{
public class CSVHelper
{
//导出为svc文件,strFileName为要导出的csv格式文件的路径和文件名:比如,"d:\test\test.csv"
public void ExportToSvc(System.Data.DataTable dt, string strFileName)
{
string strPath = strFileName;
if (File.Exists(strPath))
{
File.Delete(strPath);
}
//先打印标头
StringBuilder strColu = new StringBuilder();
StringBuilder strValue = new StringBuilder();
int i = 0;
try
{
StreamWriter sw = new StreamWriter(new FileStream(strPath, FileMode.CreateNew), Encoding.GetEncoding("GB2312"));

for (i = 0; i <= dt.Columns.Count - 1; i++)
{
strColu.Append(dt.Columns[i].ColumnName);
strColu.Append(",");
}
strColu.Remove(strColu.Length - 1, 1);//移出掉最后一个,字符

sw.WriteLine(strColu);

foreach (DataRow dr in dt.Rows)
{
strValue.Remove(0, strValue.Length);//移出

for (i = 0; i <= dt.Columns.Count - 1; i++)
{
strValue.Append(dr[i].ToString());
strValue.Append(",");
}
strValue.Remove(strValue.Length - 1, 1);//移出掉最后一个,字符
sw.WriteLine(strValue);
}

sw.Close();
}
catch (Exception ex)
{
throw ex;
}
System.Diagnostics.Process.Start(strPath);
}
}
}
春天的气息 2009-02-12
  • 打赏
  • 举报
回复
csv是excel的另一种格式,按excel文件方式读取应行了。
slimfeng 2009-02-12
  • 打赏
  • 举报
回复
可以先自己写一个简单的csv文件,测试上面的程序,
估计跟编码有关。
wuyq11 2009-02-12
  • 打赏
  • 举报
回复
wuernan 2009-02-12
  • 打赏
  • 举报
回复
1楼的,我想读进来后,对字段进行操作,不知道当文件读进来的话怎么整,麻烦你讲讲
wuernan 2009-02-12
  • 打赏
  • 举报
回复
能不能代码再说完整一些呢,,,对这个csv可是头痛死了,折腾了一下午,楼上说的是导出的吧,查进来的代码有吗
dyshadow 2009-02-12
  • 打赏
  • 举报
回复

DataTable tableToSave = new DataTable();
string dataToSave = "";
foreach (DataRow rowToSave in tableToSave.Rows)
{
for (int i = 0; i < tableToSave.Columns.Count; i++)
{
dataToSave += rowToSave[i].ToString();
if (i != tableToSave.Columns.Count - 1)
dataToSave += ",";
}
dataToSave += Environment.NewLine;
}

只后只要将dataToSave以文本形式写入就可以了.
NSnaiL 2009-02-12
  • 打赏
  • 举报
回复
文本文件怎么读就怎末读

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧