繁体   English   中英

想要将字符串数组中的数据填充到 c# 中的数据表中

[英]Want to fill data from array of string to datatable in c#

public void DecryptFile(string filePath, string CompanyName)
{
                
    using (var fileStream = new FileStream(filePath, FileMode.Open))
    {
        using (var gzStream = new GZipStream(fileStream, CompressionMode.Decompress))
        {
            using (var outputStream = new MemoryStream())
            {
                gzStream.CopyTo(outputStream);
                byte[] outputBytes = outputStream.ToArray();
                // DeserailizeByteArrayToDatatable(outputBytes, CompanyName);
                string FileContents = Encoding.ASCII.GetString(outputBytes);
                DataTable dt = new DataTable();
                string[] arrayList = FileContents.Split("\n");
            }
        }
    }                   
}

我已经解密了文件的内容,现在我想将数据填充到DataTable 文件内容的格式为:

serial_number,peak_period_start_time,stop_time
15AA01AF361903PC,1602619200,1602615600
15AA01AF361902QB,1602619200,1602615600
15AA01AF361906YL,1602619200,1602630000
09AA01AF32190YXP,1602619200,1602630000

所以我想将第一行作为DataTable和 rest 中的列作为行,另外我想更改start_time和 stop 时间以更正格式

我将遵循的一般概念是:

  1. 阅读第一行并确定我需要创建哪些列和多少列
  2. 对于每一列,使用f.Columns.Add()将该列添加到 DataTable。
  3. 对于后面的每一行f.Rows.Add()填写数据。

就像是:

    public void DecryptFile(string filePath, string CompanyName)
    {
        
        using (var fileStream = new FileStream(filePath, FileMode.Open))
        {
            using (var gzStream = new GZipStream(fileStream, CompressionMode.Decompress))
            {
                using (var outputStream = new MemoryStream())
                {
                    gzStream.CopyTo(outputStream);
                    byte[] outputBytes = outputStream.ToArray();
                    //DeserailizeByteArrayToDatatable(outputBytes, CompanyName);
                    string FileContents = Encoding.ASCII.GetString(outputBytes);
                    DataTable newTable = new DataTable();
                    string[] arrayList = FileContents.Split('\n');

                    int rowIndex = 0;
                    foreach (string line in arrayList)
                    {
                        // Assuming comma separated columns
                        string[] columns = line.Split(',');
                        int columnIndex = 0;
                        DataRow row = (rowIndex == 0 ? null : newTable.NewRow());
                        foreach (string columnValue in columns)
                        {
                            if (rowIndex == 0)
                            {
                                newTable.Columns.Add(new DataColumn(columnValue));
                            }
                            else
                            {
                                row[columnIndex] = columnValue;
                            }
                        }

                        rowIndex ++;
                    }
                }

            }
        }          

(没有测试过代码)

您可以使用下面的 function 创建数据表。 我不确定你想要什么格式的开始时间和结束时间,所以我在评论中提到了你可以这样做的地方。

public static DataTable ArrayOfStringToDataTable(string[] stringArray)
    {
        DataTable dataTable = new DataTable();
        if (stringArray.Length == 0)
        {
            return dataTable;
        }
        var headers = stringArray[0].Split(',');
        foreach (var header in headers)
        {
            dataTable.Columns.Add(header, typeof(string));
        }
        if (stringArray.Length == 1)
        {
            return dataTable;
        }
        for (var i = 1; i < stringArray.Length; i++) {
            var rows = stringArray[i].Split(',');
            var dataRow = dataTable.NewRow();
            dataRow[0] = rows[0];
            dataRow[1] = rows[1]; // do required formatting
            dataRow[2] = rows[2]; // do required formatting
            dataTable.Rows.Add(dataRow);
        }
        return dataTable;
    }

我建议您首先创建一个接受DataTable和列数组并将列添加到DataTable的方法。

public DataTable AddColumns(DataTable dt, string[] columns)
{
    if (dt == null) dt = new DataTable();
    foreach (string column in columns)
    {
        dt.Columns.Add(column.Trim());
    }
    return dt;
}

然后,创建一个将数据填充到该DataTable的方法:

public DataTable PopulateData(DataTable dt, string[] dataLines)
{
    if (dataLines == null || dataLines.Length == 0) return dt;

    foreach (string line in dataLines)
    {
        var splittedLine = line.Split(',');
        var row = dt.NewRow();
        for (int i = 0; i < splittedLines.Length; i++)
        {
            row[i] = splittedLines[i].Trim();
        }
        dt.Rows.Add(row);
    }
    return dt;
}

在您的DecryptFile方法中调用上述方法,如下所示:

public void DecryptFile(string filePath, string CompanyName)
{
                
    using (var fileStream = new FileStream(filePath, FileMode.Open))
    {
        using (var gzStream = new GZipStream(fileStream, CompressionMode.Decompress))
        {
            using (var outputStream = new MemoryStream())
            {
                gzStream.CopyTo(outputStream);
                byte[] outputBytes = outputStream.ToArray();
                // DeserailizeByteArrayToDatatable(outputBytes, CompanyName);
                string FileContents = Encoding.ASCII.GetString(outputBytes);
                DataTable dt = new DataTable();
                string[] arrayList = FileContents.Split("\n");
                // Usage
                if (arrayList.Length > 0)
                {
                   var columns = arrayList[0].Split(',');
                   var data = arrayList.AsEnumerable().Skip(1).ToArray(); // skip the first line.
                   dt = PopulateData(AddColumns(dt, columns), data);
                }
            }
        }
    }                   
}

注意:我知道,您的文件在 header 行中有 4 列,并且它提供了 3 个不正确的值,您必须提供相等的列及其值,否则,您可能希望以不同的方式处理行创建。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM