ssis - загрузить несколько CSV с другой структурой на сервер SQL - PullRequest
0 голосов
/ 16 января 2019

У меня есть несколько файлов CSV (более 60) с разной структурой (разное количество столбцов, разные имена столбцов), и я хочу загрузить их в таблицы SQL Server.

  • Каждый CSV-файл будет загружен в другую таблицу.
  • Процесс SSIS должен автоматически создать таблицу со структурой CSV и загрузить данные CSV в таблицу.

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Это можно сделать с помощью задачи «Сценарий» в цикле Foreach типа перечислителя файлов.Обратите внимание, что этот пример предназначен для отправки данных в промежуточные таблицы, поскольку каждый столбец определяется как VARCHAR(250).Возможно, вам придется отрегулировать длину, 250 использовался только для целей тестирования.Созданные таблицы названы в честь файлов, из которых поступают данные, и вы должны быть уверены, что таблицы с этими именами уже не существуют, иначе они будут удалены.Если вы хотите, чтобы это не сработало, когда таблица с таким именем уже существует, удалите первый вызов SqlCommand.ExecuteNonQuery(), который выполняет этот шаг.В цикле Foreach добавьте переменную с индексом 0 для хранения имени файла, затем добавьте эту переменную в поле ReadOnlyVariables Задачи сценария.Эта переменная VariableWithFilePath в приведенном ниже примере.

using System.Data.SqlClient;
using System.IO;
using System.Collections.Generic;
using System.Linq;


string connstr = @"Data Source=YourServer;Initial Catalog=YourDatabase;Integrated Security=SSPI;";

//get file path
string fullFileName = Dts.Variables["User::VariableWithFilePath"].Value.ToString();

//get only file name to be used when creating table
string fileName = Path.GetFileNameWithoutExtension(fullFileName);

DataTable dt = new DataTable();
using (StreamReader sr = new StreamReader(fullFileName))
{
    List<string> colNames = new List<string>();

    string firstLine = sr.ReadLine();
    string[] headers = firstLine.Split(',');

    foreach (string h in headers)
    {
        dt.Columns.Add(h);
        colNames.Add(h);
    }

    int columnCount = headers.Count();
    string line = sr.ReadLine();

    while (line != null)
    {
        string[] fields = line.Split(',');

        int currentLength = fields.Count();
        if (currentLength < columnCount)
        {
            //make sure fields from each row are kept together 
            while (currentLength < columnCount)
            {
                line += sr.ReadLine();
                currentLength = line.Split(',').Count();
            }
            fields = line.Split(',');
        }

        //load data table
        dt.Rows.Add(fields);
        line = sr.ReadLine();
    }
    string columns = string.Join(" VARCHAR(250), ", colNames);

    //command to drop table if it already exist
    string dropDDL = "IF (OBJECT_ID(N'DBO." + fileName + "') IS NOT NULL) DROP TABLE DBO." + fileName;

    //command to create new with same name as file
    string createDDL = "CREATE TABLE DBO." + fileName + " ( " + columns + " VARCHAR(250) )";

    using (SqlConnection conn = new SqlConnection(connstr))
    {
        SqlCommand sql = new SqlCommand();
        sql.Connection = conn;
        sql.CommandText = dropDDL;

        //drop table if exists
        conn.Open();
        sql.ExecuteNonQuery();

        //create table
        sql.CommandText = createDDL;
        sql.ExecuteNonQuery();

        //load SQL Server table from data table
        using (SqlBulkCopy blkCpy = new SqlBulkCopy(conn))
        {
            blkCpy.DestinationTableName = fileName;
            blkCpy.WriteToServer(dt);
        }
    }

}
0 голосов
/ 16 января 2019

Вы можете "попробовать" следующее.

Создать промежуточную таблицу с 1 столбцом для хранения данных.VARCHAR (MAX) + 1 столбец для хранения имени файла

. Затем настройте SSIS для загрузки каждой строки в этот столбец (без разделителя столбцов). Вам, вероятно, потребуется загрузить заголовок как строку данных, чтобы получитьИмена столбцов.

Затем вы можете использовать цикл ForEach в этой таблице.

Наконец, вы должны написать сохраненный процесс, который анализирует имена столбцов, разделенных запятыми, и динамически создает таблицы назначения, а также анализирует значения и загрузку.их.

Не самый эффективный способ загрузки данных, но если у вас небольшой размер файла, с вами все будет в порядке ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...