簡體   English   中英

如何將由新行和逗號分隔的字符串轉換為C#中的DataTable

[英]How to convert string separated by new line and comma to DataTable in C#

我有一個像這樣的字符串:

"Product,Price,Condition Cd,13,New Book,9,Used "

這是通過這樣的:

"Product,Price,Condition\\r\\Cd,13,New\\r\\nBook,9,Used"

我怎么能把它轉換為DataTable?

嘗試使用此輔助函數執行此操作:

            DataTable dataTable = new DataTable();
            bool columnsAdded = false;
            foreach (string row in data.Split(new string[] { "\r\n" }, StringSplitOptions.None))
            {
                DataRow dataRow = dataTable.NewRow();
                foreach (string cell in row.Split(','))
                {
                    string[] keyValue = cell.Split('~');
                    if (!columnsAdded)
                    {
                        DataColumn dataColumn = new DataColumn(keyValue[0]);
                        dataTable.Columns.Add(dataColumn);
                    }
                    dataRow[keyValue[0]] = keyValue[1];
                }
                columnsAdded = true;
                dataTable.Rows.Add(dataRow);
            }
            return dataTable;

但是,我沒有得到“連接具有適當列的單元格”部分 - 我的單元格中沒有~string[] keyValue = cell.Split('~'); 我顯然在DataColumn dataColumn = new DataColumn(keyValue[0]);獲得了一個IndexOutOfRange DataColumn dataColumn = new DataColumn(keyValue[0]);

您可以在一次調用中將給定的字符串拆分為扁平字符串數組。 然后,您可以遍歷數組並填充對象列表。

該部分是可選的,因為您可以立即填充DataTable但我認為在處理DataTable時使用強類型對象更容易(更易於維護)。

string input = "Product,Price,Condition\r\nCd,13,New\r\nBook,9,Used";

string[] deconstructedInput = input.Split(new string[] { "\r\n", "," }, StringSplitOptions.None);

List<Product> products = new List<Product>();
for (int i = 3; i < deconstructedInput.Length; i += 3)
{
    products.Add(new Product
    {
        Name = deconstructedInput[i],
        Price = Decimal.Parse(deconstructedInput[i + 1]),
        Condition = deconstructedInput[i + 2]
    });
}

public class Product
{
    public string Name { get; set; }

    public decimal Price { get; set; }

    public string Condition { get; set; }
}

因此, products集合包含2個對象,您可以輕松地迭代並填充DataTable

注意:這需要進一步檢查以避免可能的運行時異常,也不是動態的。 這意味着,如果你有不同的結構輸入,它將無法正常工作。

DataTable dataTable = new DataTable();

dataTable.Columns.Add(new DataColumn(nameof(Product.Name)));
dataTable.Columns.Add(new DataColumn(nameof(Product.Price)));
dataTable.Columns.Add(new DataColumn(nameof(Product.Condition)));

foreach (var product in products)
{
    var row = dataTable.NewRow();
    row[nameof(Product.Name)] = product.Name;
    row[nameof(Product.Price)] = product.Price;
    row[nameof(Product.Condition)] = product.Condition;
    dataTable.Rows.Add(row);
}

你可以簡單地使用Linq(實際上Nuget上有LinqToCSV,也許你更喜歡這樣):

void Main()
{
    string data = @"Product,Price,Condition
Cd,13,New
Book,9,Used
";
    var table = ToTable(data);
    Form f = new Form();
    var dgv = new DataGridView { Dock = DockStyle.Fill, DataSource = table };
    f.Controls.Add(dgv);
    f.Show();
}

private DataTable ToTable(string CSV)
{
    DataTable dataTable = new DataTable();
    var lines = CSV.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
    foreach (var colname in lines[0].Split(','))
    {
        dataTable.Columns.Add(new DataColumn(colname));
    }
    foreach (var row in lines.Where((r, i) => i > 0))
    {
        dataTable.Rows.Add(row.Split(','));
    }
    return dataTable;
}

根據您的實現,我已經為您編寫了代碼,我還沒有測試過。 但你可以使用這個概念。

DataRow dataRow = dataTable.NewRow();
int i = 0;
foreach (string cell in row.Split(','))
{
    if (!columnsAdded)
    {
        DataColumn dataColumn = new DataColumn(cell);
        dataTable.Columns.Add(dataColumn);
    }
    else
    {
        dataRow[i] = cell;
    }
    i++;
}
if(columnsAdded)
{
    dataTable.Rows.Add(dataRow);
}
columnsAdded = true;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM