cvs其实等于有固定分隔格式的txt。读取后可以用,分隔成list,这样就很方便的循环读取特定列了。
你可以用sublime 或notepad++打开cvs文件就一目了然了.
with open('D:\\test.csv', 'r') as f:cvs_data = f.readlines()
for i in cvs_data:
cvs_list = i.strip().split(',')
using Systemusing System.Collections.Generic
using System.Text
using System.Data
using System.Windows.Forms
using System.IO
using Microsoft.VisualBasic.FileIO
namespace INGTEC.Framework
{
/// <summary>
/// *** 作CSV存取类
/// </summary>
public static class INGCSV
{
#region 变量
/// <summary>
/// 取出配置文件中的分隔符
/// </summary>
private static string _splitChar = null
/// <summary>
/// 取出配置文件中的编码方式
/// </summary>
private static string _encodeFormat = null
#endregion
#region 构造方法
/// <summary>
/// 构造方法获取分隔符、编码方式
/// </summary>
static INGCSV()
{
_splitChar = INGConfig.GetConfig(INGConstants.XML_CONFIG, INGConstants.XML_CSV_SPLIT, INGConstants.XML_SPLIT_CHAR)
_encodeFormat = INGConfig.GetConfig(INGConstants.XML_CONFIG, INGConstants.XML_ENCODING, INGConstants.XML_ENCODE_FORMAT)
}
#endregion
#region 写CSV方法
/// <summary>
/// 写入CSV
/// </summary>
/// <param name="hasHeader">列头</param>
/// <param name="dtOutputCSV">文件内容</param>
public static void WriteCSV(bool hasHeader, DataTable dtOutputCSV)
{
// Log开始
INGLog.WriteLog(INGLogLevel.Debug, INGConstants.START)
// 获取写入文件名称以及格式
String strFileName
SaveFileDialog savFileDialog = new SaveFileDialog()
savFileDialog.Reset()
savFileDialog.DefaultExt = "csv"
savFileDialog.Filter = "CSV|*.csv"
savFileDialog.ShowDialog()
strFileName = savFileDialog.FileName
// 判断文件名
if (string.IsNullOrEmpty(strFileName))
{
// 信息提示
INGMessage.ShowMessage("M009", "WriteFileName")
}
// 重载方法调用,写入文件
WriteCSV(hasHeader, dtOutputCSV, strFileName)
// Log结束
INGLog.WriteLog(INGLogLevel.Debug, INGConstants.END)
}
#endregion
#region 写入CSV,附带路径方法
/// <summary>
/// 写入CSV,附带路径
/// </summary>
/// <param name="hasHeader">列头</param>
/// <param name="dtOutputCSV">文件内容</param>
/// <param name="strPath">指定文件路径</param>
public static void WriteCSV(bool hasHeader, DataTable dtOutputCSV, string strPath)
{
// Log开始
INGLog.WriteLog(INGLogLevel.Debug, INGConstants.START)
// DataTable有无判断
if (dtOutputCSV == null)
{
throw new ArgumentNullException("Argument(dtOutputCSV) is null!")
}
// StringBuilder初始化
StringBuilder sb = new StringBuilder()
// DataTable有无数据判断
if (hasHeader)
{
//添加列头
foreach (DataColumn dc in dtOutputCSV.Columns)
{
if (dc.DataType == Type.GetType("System.String"))
{
dc.ColumnName = "'" + dc.ColumnName + "'" //修改
}
sb.Append(dc.ColumnName).Append(_splitChar)
}
// 创建新行
sb.Remove(sb.Length - 1, 1)
sb.Append(Environment.NewLine)
}
// 路径为空或者取消保存时
if(strPath == "")
{
return
}
// 添加行
foreach (DataRow dr in dtOutputCSV.Rows)
{
foreach (object rowItem in dr.ItemArray)//object rowItem
{
object itemValue = rowItem
itemValue = "'" + itemValue + "'"
sb.Append(itemValue).Append(_splitChar)
}
// 创建新行
sb.Remove(sb.Length - 1, 1)
sb.Append(Environment.NewLine)
}
using (TextWriter tw = new StreamWriter(strPath, false, Encoding.GetEncoding(_encodeFormat)))
{
tw.Write(sb.ToString())
INGMessage.ShowMessage("M010", "Success")
tw.Flush()
tw.Close()
}
// Log结束
INGLog.WriteLog(INGLogLevel.Debug, INGConstants.END)
}
#endregion
#region 读CSV文件方法
/// <summary>
/// 读CSV文件
/// </summary>
/// <param name="hasHeader">列头</param>
/// <returns>返回信息</returns>
public static DataTable ReadCSV(bool hasHeader)
{
// Log开始
INGLog.WriteLog(INGLogLevel.Debug, INGConstants.START)
String strFileName
using (OpenFileDialog ofdFileDialog = new OpenFileDialog())
{
ofdFileDialog.Reset()
ofdFileDialog.DefaultExt = "csv"
ofdFileDialog.Filter = "CSV|*.csv"
ofdFileDialog.ShowDialog()
// 文件名取得
strFileName = ofdFileDialog.FileName
}
// 文件路径取得
String strFilePath = Path.GetFileName(strFileName)
// 文件路径判断
if (string.IsNullOrEmpty(strFilePath))
{
return null
}
// Log结束
INGLog.WriteLog(INGLogLevel.Debug, INGConstants.END)
return ReadCSV(hasHeader, strFilePath)
}
#endregion
#region 读指定路径CSV文件方法
/// <summary>
/// 读指定路径CSV文件
/// </summary>
/// <param name="hasHeader">列头</param>
/// <param name="strPath">指定文件路径</param>
/// <returns>返回信息</returns>
public static DataTable ReadCSV(bool hasHeader, string strPath)
{
// Log开始
INGLog.WriteLog(INGLogLevel.Debug, INGConstants.START)
String FileName = Path.GetFileName(strPath)
// 文件路径判断
if (string.IsNullOrEmpty(FileName))
{
return null
}
DataTable dt = new DataTable(FileName)
// 文本文件分析instance生成
TextFieldParser parser = new TextFieldParser(strPath, Encoding.GetEncoding(_encodeFormat))
// 指定文件形式
parser.TextFieldType = FieldType.Delimited
// 段落分割
parser.SetDelimiters(_splitChar)
// 设置CSV行计数
int iRowCnt = 0
// 到文件最后边界
while (!parser.EndOfData)
{
// 读入一行
string[] row = parser.ReadFields()
// CSV行判断
if (iRowCnt.Equals(0))
{
// 判断列头有无
if (hasHeader)
{
int i = 0
// 添加列到行
foreach (string sColumn in row)
{
// DataColumn初始化
DataColumn column = new DataColumn()
column.DataType = Type.GetType("System.String")
string sColumnValue = sColumn
sColumnValue = sColumnValue.Substring(1, sColumnValue.Length - 2)
column.ColumnName = sColumnValue
dt.Columns.Add(column)
}
}
}
// 数据
else //修改
{
// 行添加
int rowLength = row.Length
DataRow dr = dt.NewRow()
for (int j = 0j <rowLengthj++ )
{
string columnValue = row.GetValue(j).ToString()
columnValue = columnValue.Substring(1, columnValue.Length - 2)
dr[j] = columnValue
}
dt.Rows.Add(dr)
}
// CSV行计数
iRowCnt++
}
// Log结束
INGLog.WriteLog(INGLogLevel.Debug, INGConstants.END)
return dt
}
#endregion
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)