C# 如何将字符串数据转换为datatable?

C# 如何将字符串数据转换为datatable?,c#,parsing,datatable,C#,Parsing,Datatable,我需要将字符串数据转换为datatable 在一个字符串中,我得到了整个数据 sffa S.No Name Address Company ---- ---- ------- ------- 1 xxx yyy zzz 2 vvv nnn dsd 下面是获取上述数据的代码 public string Read() { if (!tcpSocket.Connected) return null;

我需要将字符串数据转换为datatable

在一个字符串中,我得到了整个数据

sffa

S.No  Name   Address  Company
----  ----   -------  -------
 1     xxx    yyy     zzz
 2     vvv    nnn     dsd
下面是获取上述数据的代码

public string Read()
    {
        if (!tcpSocket.Connected) return null;
        StringBuilder sb=new StringBuilder();
        do
        {
            ParseTelnet(sb);

            System.Threading.Thread.Sleep(TimeOutMs);
        } while (tcpSocket.Available > 0);
        var strResult=sb.ToString();
        return strResult;
    }

我想要S.No,Name,Address,Company作为列,这些值应该在相应的列中


请提前提供帮助和感谢。

假定选项卡是分隔符:

IEnumerable<string[]> data = text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
    .Select(line => line.Split('\t'))
    .Where(fields => fields.Length == 4)
    .ToList();
DataTable table = new DataTable();
foreach(string col in data.First())
    table.Columns.Add(col);
foreach (string[] fields in data.Skip(1))
    table.Rows.Add(fields);
IEnumerable data=text.Split(新[]{Environment.NewLine},StringSplitOptions.RemoveEmptyEntries)
.Select(line=>line.Split('\t'))
.Where(fields=>fields.Length==4)
.ToList();
DataTable=新的DataTable();
foreach(data.First()中的字符串列)
表.列.添加(列);
foreach(data.Skip(1)中的字符串[]字段)
table.Rows.Add(字段);
如果分隔符是一个或多个空格,且值本身不能包含空格:

IEnumerable<string[]> data = text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
    .Select(line => line.Trim().Split(new char[]{}, StringSplitOptions.RemoveEmptyEntries))
    .Where(fields => fields.Length == 4)
    .ToList();
IEnumerable data=text.Split(新[]{Environment.NewLine},StringSplitOptions.RemoveEmptyEntries)
.Select(line=>line.Trim().Split(新字符[]{},StringSplitOptions.RemoveEmptyEntries))
.Where(fields=>fields.Length==4)
.ToList();
string data=@“S.No Name地址公司
----  ----   -------  -------
1 xxx yyy zzz
2 vvv nnn dsd”;
var lines=data.Split(new[]{Environment.NewLine},StringSplitOptions.None);
变量长度=行[1]+“”//我们会认为破折号是列标记。
var insideColumn=假;
int start=0;
var columns=新列表();
for(int i=0;i
请共享一个字符串,其中包含所有数据。分隔符是什么?多个空格还是一个选项卡?请查看更新的question@Raj:那么分隔符是什么?@Raj是数据的“sffa”部分吗?这是什么意思?谢谢你的及时回复。我已经尝试了您的代码,但在数据变量中我看不到任何值。正在调试模式下检查Datacount=0。请给出建议。我希望S.No、Name、Address、Company作为列,并且这些值应该在相应的列中。@Ra:您还没有提到分隔符。它似乎不是制表符。那个么它是什么呢?分隔符是列中每个值之间的空格。@raw:我非常怀疑它。如果值本身包含空格怎么办?然而,编辑了我的答案。
        string data = @"S.No  Name   Address  Company
----  ----   -------  -------
 1     xxx    yyy     zzz
 2     vvv    nnn     dsd";

        var lines = data.Split(new[] {Environment.NewLine}, StringSplitOptions.None);
        var lengths = lines[1] + " "; //We'll think the dashes are the column markers.

        var insideColumn = false;
        int start = 0;
        var columns = new List<Tuple<int, int>>();
        for (int i = 0; i < lengths.Length; i++) {
            if (insideColumn && lengths[i] == ' ') {
                insideColumn = false;
                columns.Add(Tuple.Create(start, i));
            }
            if (!insideColumn && lengths[i] == '-') {
                insideColumn = true;
                start = i;
            }
        }

        var headers = new List<string>(columns.Count);
        for (int i = 0; i < columns.Count; i++) {
            headers.Add(lines[0].Substring(columns[i].Item1, columns[i].Item2 - columns[i].Item1).Trim());
        }

        var table = new List<Dictionary<string,string>>();
        for (int i = 2; i < lines.Length; i++) {
            var record = new Dictionary<string, string>();
            var line = lines[i].PadRight(lengths.Length);
            for (int j = 0; j < columns.Count; j++) {
                record[headers[j]] = line.Substring(columns[j].Item1, columns[j].Item2 - columns[j].Item1).Trim();
            }
            table.Add(record);
        }