C# 要在c中将字符串数组中的数据填充到datatable中吗#

C# 要在c中将字符串数组中的数据填充到datatable中吗#,c#,C#,我已经解密了文件的内容,现在我想将数据填充到DataTable。文件内容的格式为: public void DecryptFile(string filePath, string CompanyName) { using (var fileStream = new FileStream(filePath, FileMode.Open)) { using (var gzStream = new GZipStream(fileStre

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

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
中的列,其余全部填充为行,此外,我还想将
开始时间
和停止时间更改为正确的格式

我将遵循的一般概念是:

  • 阅读第一行并确定需要创建哪些列以及创建多少列
  • 对于每个列,使用
    f.Columns.Add()
    将列添加到数据表中
  • 对于后面的每一行,请填写数据
  • 比如:

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

    (尚未测试代码)

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

        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 ++;
                        }
                    }
    
                }
            }          
    
    公共静态数据表ArrayOfStringToDataTable(字符串[]stringArray)
    {
    DataTable=新的DataTable();
    如果(stringArray.Length==0)
    {
    返回数据表;
    }
    var headers=stringArray[0]。拆分(',');
    foreach(标头中的var标头)
    {
    dataTable.Columns.Add(header,typeof(string));
    }
    if(stringArray.Length==1)
    {
    返回数据表;
    }
    对于(var i=1;i
    我建议您首先创建一个方法,该方法将接受一个
    数据表
    和一个列数组,并将列添加到
    数据表

    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;
        }
    
    然后,创建一个将数据填充到该
    数据表中的方法:

    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;
    }
    

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

    使用datatable有什么特殊原因吗?我可能会建议创建一个方法,将字符串解析为对象列表。请查看DataTable的示例。此外,我想将开始时间和停止时间更改为正确的格式-不要同时解析为
    DateTime
    类型,并将其另存为数据库中的
    DateTime
    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;
    }
    
    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);
                    }
                }
            }
        }                   
    }