Sélectionnez plusieurs CSV et regroupez-les dans la base de données

c# database openfiledialog sqlbulkcopy sql-server

Question

J'utilise une base de données MDF avec la classe OpenFileDialog pour importer un seul fichier CSV dans une base de données. Cela fonctionne bien pour un seul fichier CSV, mais je dois ouvrir et traiter plusieurs fichiers CSV en bloc.

Comment puis-je améliorer mon code? J'ai essayé d'utiliser une boucle for .

Voici mon code pour traiter un seul fichier CSV:

ofd.Filter = "CSV files (*.csv) | *.csv; | CSV PRN files (*.prn,) |*.prn;";
ofd.FileName = "";
ofd.ShowDialog();
DataTable dt = new DataTable();
string line = null;
int i = 0;
using (StreamReader sr = File.OpenText(ofd.FileName))
{
    while ((line = sr.ReadLine()) != null)
    {
        string[] data = line.Split(',');
        if (data.Length > 0)
        {
            if (i == 0)
            {
                foreach (var item in data)
                {
                    dt.Columns.Add(new DataColumn());
                }

                i++;
            }

            DataRow row = dt.NewRow();
            row.ItemArray = data;
            dt.Rows.Add(row);
        }

    }
}

string symbolName = dt.Rows[1][0].ToString();
string strConnection =
@"Data Source =.\SQLEXPRESS; AttachDbFilename = C:\USERS\JEF\DOCUMENTS\DATABASE1.MDF; Integrated Security = True; Connect Timeout = 30; User Instance = True";
SqlConnection condb2 = new SqlConnection(strConnection);
string createTablerow ="create table ["+symbolName+"] (code1 VARCHAR(100) COLLATE Arabic_CI_AI_KS_WS,date1 varchar(50),open1 varchar(50),high1 varchar(50),low1 varchar(50),close1 varchar(50),vol1 varchar(50))";
using (SqlConnection connection = new SqlConnection(strConnection))
{
    SqlCommand command1 = new SqlCommand(createTablerow, connection);
    connection.Open();
    command1.ExecuteNonQuery();

}
using (SqlConnection cn = new SqlConnection(strConnection))
{
    cn.Open();
    using (SqlBulkCopy copy = new SqlBulkCopy(cn))
    {
        copy.ColumnMappings.Add(0, "code1");
        copy.ColumnMappings.Add(1, "date1");
        copy.ColumnMappings.Add(2, "open1");
        copy.ColumnMappings.Add(3, "high1");
        copy.ColumnMappings.Add(4, "low1");
        copy.ColumnMappings.Add(5, "close1");
        copy.ColumnMappings.Add(6, "vol1");
        copy.DestinationTableName = "[" + symbolName + "]";
        copy.WriteToServer(dt);
    }
}

Réponse acceptée

J'ai déplacé certains de vos codes pour le rendre plus efficace:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Data.SqlClient;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            ofd.FileName = "";
            ofd.ShowDialog();
            string line = null;
            int i = 0;

            string strConnection =
            @"Data Source =.\SQLEXPRESS; AttachDbFilename = C:\USERS\JEF\DOCUMENTS\DATABASE1.MDF; Integrated Security = True; Connect Timeout = 30; User Instance = True";

            using (SqlConnection connection = new SqlConnection(strConnection))
            {
                connection.Open();
                SqlBulkCopy copy = new SqlBulkCopy(connection);

                copy.ColumnMappings.Add(0, "code1");
                copy.ColumnMappings.Add(1, "date1");
                copy.ColumnMappings.Add(2, "open1");
                copy.ColumnMappings.Add(3, "high1");
                copy.ColumnMappings.Add(4, "low1");
                copy.ColumnMappings.Add(5, "close1");
                copy.ColumnMappings.Add(6, "vol1");


                foreach (string file in ofd.FileNames)
                {
                    using (StreamReader sr = File.OpenText(file))
                    {
                        DataTable dt = new DataTable();

                        while ((line = sr.ReadLine()) != null)
                        {
                            string[] data = line.Split(',');
                            if (data.Length > 0)
                            {
                                if (i == 0)
                                {
                                    foreach (var item in data)
                                    {
                                        dt.Columns.Add(new DataColumn());
                                    }

                                    i++;
                                }

                                DataRow row = dt.NewRow();
                                row.ItemArray = data;
                                dt.Rows.Add(row);
                            }
                        }

                        string symbolName = dt.Rows[1][0].ToString();

                        string createTable = string.Format("create table [{0}] (code1 VARCHAR(100) COLLATE Arabic_CI_AI_KS_WS,date1 varchar(50),open1 varchar(50),high1 varchar(50),low1 varchar(50),close1 varchar(50),vol1 varchar(50))",
                            symbolName);

                        using (SqlCommand command1 = new SqlCommand(createTable, connection))
                        {
                            command1.ExecuteNonQuery();

                            copy.DestinationTableName = "[" + symbolName + "]";
                            copy.WriteToServer(dt);

                        }
                    }
                }
            }
        }
    }
}

Réponse populaire

Afin de traiter plusieurs fichiers à la fois, vous devrez utiliser un code parallèle. Votre utilisation de "pour" était un bon essai, mais les boucles "pour" fonctionnent toujours simultanément, ce qui signifie une à la fois.

Le moyen le plus simple de réaliser ce traitement parallèle dans ce cas serait d’utiliser Parallel.Foreach. Voici un guide Microsoft sur ce sujet: https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/how -écrire-une-boucle-parallèle-simple-pour-chaque



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi