Предварительная обработка набора данных SQL - PullRequest
0 голосов
/ 02 февраля 2012

У меня есть плоский файл набора данных со 100 строками и 2001 атрибутами:

att1,att2,att4,att5,att6,att7,att8,att9,att10,....,att2000,type
5,3,4,4,1,5,1,3,2,4,...,12,Agresti
4,4,2,0,1,0,2,0,0,0,...,22,bbresti
0,0,0,0,0,0,0,0,1,0,...,34,bbresti
0,0,0,1,0,0,0,1,1,1,...,45,Agresti
...
0,6,0,0,0,0,1,0,3.5,...,1,Agresti

И я хотел бы предварительно обработать эти данные как

i,j,val
1,1,5
1,2,4
1,3,0
1,4,0
...
1,100,0
2,1,3
2,2,4
2,3,0
2,4,0
...
2,100,6
3,1,4
3,2,2
3,3,0
3,4,0
...
...
2000,100,1

Так я получаюизбавившись от типа последнего столбца, я знаю, что в SQL я бы сделал что-то вроде:

CREATE TABLE matrix (Row int NOT NULL, Column int NOT NULL, Value <datatype> NOT NULL)

SELECT Row AS Column
       ,Column AS Row
       ,Value
FROM matrix

Но, как я хотел бы просто импортировать таблицу в SQL, но как выглядит код в C #

1 Ответ

1 голос
/ 02 февраля 2012

Вот идея некоторого C #, который примет ваш входной файл и переформатирует ваш запрос.Затем используйте класс SqlBulkCopy , чтобы перенести ваши данные в таблицу в SQLServer.

Надеюсь, это поможет.

using System.IO;

namespace ConsoleApplication1
{
     class Program
     {
          static void Main(string[] args)
          {
                string[] parts;
                //string[] lines = System.IO.File.ReadAllLines(@"somefile.csv");
                string[] lines = new string[] { 
                     "a1,a2,a3,a4,type", 
                     "22,33,44,55,t1", 
                     "222,333,444,555,t2", 
                     "2222,3333,4444,5555,t3" };
                int lineno = 1;

                string path = @"c:\output.csv";
                using (TextWriter writer = File.CreateText(path))
                {
                     foreach (string line in lines)
                     {
                          if (lineno > 1)
                          {
                                parts = line.Split(',');
                                for (int a = 0; a < parts.Length - 1; a++)
                                     writer.WriteLine(lineno.ToString() + "," + (a+1).ToString() + "," + parts[a]);
                          }
                          lineno++;
                     }
                }
          }
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...