C# 数据表的CSV字符串

C# 数据表的CSV字符串,c#,.net,linq,csv,datatable,C#,.net,Linq,Csv,Datatable,我有下面的字符串, 我想把它转换成数据表 "Id,Name ,Dept\r\n1,Mike,IT\r\n2,Joe,HR\r\n3,Peter,IT\r\n" 我可以使用String.Split和遍历集合来创建它。 但我需要高效的方法(使用C#4.0特性) 如何使用LINQ或lambda创建表。我不知道您在寻找什么: string s = "Id,Name ,Dept\r\n1,Mike,IT\r\n2,Joe,HR\r\n3,Peter,IT\r\n"; DataTable

我有下面的字符串, 我想把它转换成数据表

"Id,Name ,Dept\r\n1,Mike,IT\r\n2,Joe,HR\r\n3,Peter,IT\r\n"
我可以使用String.Split和遍历集合来创建它。 但我需要高效的方法(使用C#4.0特性)
如何使用LINQ或lambda创建表。

我不知道您在寻找什么:

string s = "Id,Name ,Dept\r\n1,Mike,IT\r\n2,Joe,HR\r\n3,Peter,IT\r\n";
        DataTable dt = new DataTable();

        string[] tableData = s.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
        var col = from cl in tableData[0].Split(",".ToCharArray())
                  select new DataColumn(cl);
        dt.Columns.AddRange(col.ToArray());

        (from st in tableData.Skip(1)
         select dt.Rows.Add(st.Split(",".ToCharArray()))).ToList();
使用系统;
使用System.Xml;
使用系统数据;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
公共静态字符串DataTableToString(DataTable dtData)
{
字符串sData=null;
StringBuilder sBuffer=null;
字符串标记=null;
int i=0;
int j=0;
sBuffer=新的StringBuilder();
sBuffer.Append(@“);
sBuffer.Append(@“);
foreach(dtData.Columns中的数据列Col)
{
sBuffer.Append(@“”)
.Append(Col.ColumnName.Replace(“&”,”))
。附加(@“);
}
sBuffer.Append(@“);
i=0;
foreach(dtData.Rows中的DataRow rw)
{
sBuffer.Append(@“);
j=0;
foreach(dtData.Columns中的数据列Col)
{
if(!Convert.IsDBNull(rw[Col.ColumnName]))
{
Token=Convert.ToString(rw[Col.ColumnName]);
}
其他的
{
令牌=null;
}
sBuffer.Append(@“”).Append(Token.Append(@“”);
j++;
}
sBuffer.Append(@“);
i++;
}
sBuffer.Append(@“);
sData=sBuffer.ToString();
返回sData;
}
公共静态数据表StringToDataTable(字符串sXmlData)
{
数据表dtData=null;
XmlDocument xmlDoc=null;
XmlNode RootNode=null;
XmlNodeList TRList=null;
XmlNodeList THList=null;
XmlNodeList TDList=null;
int i=0;
int j=0;
XmlAttribute DataTypeAttrib=null;
字符串sDataType=null;
DataColumn=null;
ColType型;
字符串标记=null;
DataRow newRw=null;
xmlDoc=新的XmlDocument();
LoadXml(sXmlData);
RootNode=xmlDoc.SelectSingleNode(“/TABLE”);
if(RootNode!=null)
{
dtData=新数据表();
i=0;
TRList=RootNode.SelectNodes(“TR”);
foreach(TRList中的XmlNode TRNode)
{
如果(i==0)
{
THList=TRNode.SelectNodes(“TH”);
foreach(THList中的XmlNode THNode)
{
DataTypeAttrib=THNode.Attributes[“ColType”];
sDataType=数据类型属性值;
ColType=Type.GetType(sDataType);
Col=新数据列(THNode.InnerText,ColType);
如果(!dtData.Columns.Contains(Col.ColumnName))
{
dtData.Columns.Add(Col);
}
}
}
其他的
{
newRw=dtData.NewRow();
j=0;
TDList=TRNode.SelectNodes(“TD”);
foreach(TDList中的XmlNode TDNode)
{
ColType=dtData.Columns[j].DataType;
Token=TDNode.InnerText;
如果(!string.IsNullOrEmpty(令牌))
{
尝试
{
newRw[j]=Convert.ChangeType(令牌,ColType);
}
抓住
{
if(ColType==typeof(DateTime))
{
newRw[j]=DateTime.ParseExact(标记,“yyyyMMdd”,System.Globalization.CultureInfo.InvariantCulture);
}
}
}
其他的
{
newRw[j]=Convert.DBNull;
}
j++;
}
dtData.Rows.Add(newRw);
}
i++;
}
}
返回数据;
}

我认为这种方法很有用。此方法可用于CSVString或CsvFilePath。如果要转换CsvFilePath,则必须指定第一个路径为true,否则为false

public DataTable ConvertCsvStringToDataTable(bool isFilePath,string CSVContent)
{
    //CSVFilePathName = @"C:\test.csv";
    string[] Lines;
    if (isFilePath)
    {
        Lines = File.ReadAllLines(CSVContent);
    }
    else
    {
        Lines = CSVContent.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
    }
    string[] Fields;
    Fields = Lines[0].Split(new char[] { ',' });
    int Cols = Fields.GetLength(0);
    DataTable dt = new DataTable();
    //1st row must be column names; force lower case to ensure matching later on.
    for (int i = 0; i < Cols; i++)
        dt.Columns.Add(Fields[i].ToLower(), typeof(string));
    DataRow Row;
    for (int i = 1; i < Lines.GetLength(0); i++)
    {
        Fields = Lines[i].Split(new char[] { ',' });
        Row = dt.NewRow();
        for (int f = 0; f < Cols; f++)
            Row[f] = Fields[f];
        dt.Rows.Add(Row);
    }
    return dt;
}
public DataTable ConvertCsvStringToDataTable(bool-isFilePath,string-CSVContent)
{
//CSVFilePathName=@“C:\test.csv”;
字符串[]行;
if(isFilePath)
{
Lines=File.ReadAllLines(CSVContent);
}
其他的
{
Lines=CSVContent.Split(“\r\n.ToCharArray(),StringSplitOptions.RemoveEmptyEntries”);
}
字符串[]字段;
字段=行[0]。拆分(新字符[]{',});
int Cols=Fields.GetLength(0);
DataTable dt=新的DataTable();
//第一行必须是列名;强制使用小写以确保以后匹配。
for(int i=0;i
我想从字符串中读取而不是从文件中读取的可能重复项也不想使用第三方dll或组件.dt.Rows.Add(从tableData.Skip(1)中的st选择st.Split(“,”.tocharray());它不起作用它应该是foreach(tableData.Skip(1)){dt.Rows.Add(item.Split(“,”.ToCharArray());}是的,对不起,你是对的,我编辑了我的代码,如果你不想使用它,我没有使用foreach
public DataTable ConvertCsvStringToDataTable(bool isFilePath,string CSVContent)
{
    //CSVFilePathName = @"C:\test.csv";
    string[] Lines;
    if (isFilePath)
    {
        Lines = File.ReadAllLines(CSVContent);
    }
    else
    {
        Lines = CSVContent.Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
    }
    string[] Fields;
    Fields = Lines[0].Split(new char[] { ',' });
    int Cols = Fields.GetLength(0);
    DataTable dt = new DataTable();
    //1st row must be column names; force lower case to ensure matching later on.
    for (int i = 0; i < Cols; i++)
        dt.Columns.Add(Fields[i].ToLower(), typeof(string));
    DataRow Row;
    for (int i = 1; i < Lines.GetLength(0); i++)
    {
        Fields = Lines[i].Split(new char[] { ',' });
        Row = dt.NewRow();
        for (int f = 0; f < Cols; f++)
            Row[f] = Fields[f];
        dt.Rows.Add(Row);
    }
    return dt;
}