C # Merge Join DataTables (используя уникальный идентификатор) Загружается CSV Parser - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь объединить и объединить два импортированных CSV-файла в один DataTable.C # является новым для меня, но я делал подобное в PS и KSH много раз прежде.

Данные загружаются нормально и выводятся на консоль так же хорошо, как две отдельные таблицы, но я не могу понять, как объединить результаты каждого ShowTable (), используя первичные ключи (wID, UserID) в качестве соединенияусловие.

Я пытался return Table_SalesUserData; and return Table_WifiUserData;, что дает [ 'Form1.CreateTableWifi()' returns void, a return keyword must not be followed by an object expression ] ошибок.

Я также пытался использовать: DataSet setSalesWifi = new DataSet(); Но в Button1_Click() выдает [ System.ArgumentNullException: ''column' argument cannot be null. Parameter name: column' ] ошибку.

Что я предполагаю, потому что .Columns для каждого выходит за рамки.

Таблицы создаются, как показано ниже.Они загружаются GenericParser (код работает нормально и довольно долго, поэтому не публиковали) это InsertTableWifi(string srcFilePathWifi) и InsertTableSales(string srcFilePathSales).

Я думаю, что я в порядке, чтобы вывести объединенные данные, когда это работает,просто не могу понять, как объединить их в новый DataTable или DataSet.

Есть ли простой способ объединить данные с тем, что у меня есть?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using GenericParsing;

namespace GenericParserv1._1._6
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }
        DataTable Table_SalesUserData = new DataTable("SalesUserData ");
        DataTable Table_WifiUserData = new DataTable("WifiUserData ");
        DataSet setSalesWifi = new DataSet();

    public void CreateTableSales()
        {
            DataColumn[] colsSales ={
                      new DataColumn("UserID",typeof(String)),
                      new DataColumn("Alias",typeof(String)),
                      new DataColumn("UserType",typeof(String)),
                      new DataColumn("AccountStatus",typeof(String)),
                      new DataColumn("ChgPasswdNxtLogin",typeof(String)),
                  };
            Table_SalesUserData.Columns.AddRange(colsSales);
            Table_SalesUserData.PrimaryKey = new DataColumn[] { Table_SalesUserData.Columns["UserID"] };
            setSalesWifi.Tables.Add(Table_SalesUserData);
            //return Table_SalesUserData ;
        }

        public void CreateTableWifi()
        {

            DataColumn[] colsWifi ={
                      new DataColumn("wID",typeof(String)),
                      new DataColumn("username",typeof(String)),
                      new DataColumn("fname",typeof(String)),
                      new DataColumn("lastname",typeof(String)),
                      new DataColumn("email",typeof(String)),
                      new DataColumn("empid",typeof(String)),
                      new DataColumn("lastlogintime",typeof(String))
                  };

            Table_WifiUserData.Columns.AddRange(colsWifi);
            Table_WifiUserData.PrimaryKey = new DataColumn[] { Table_WifiUserData.Columns["wID"] };
            setSalesWifi.Tables.Add(Table_WifiUserData);
            //return Table_WifiUserData ;
        }

        public void CreateTableReport()
        {

            DataColumn[] colsMerge ={
                      new DataColumn("wID",typeof(String)),
                      new DataColumn("username",typeof(String)),
                      new DataColumn("fname",typeof(String)),
                      new DataColumn("lastname",typeof(String)),
                      new DataColumn("email",typeof(String)),
                      new DataColumn("empid",typeof(String)),
                      new DataColumn("lastlogintime",typeof(String)),
                      new DataColumn("UserID",typeof(String)),
                      new DataColumn("Alias",typeof(String)),
                      new DataColumn("UserType",typeof(String)),
                      new DataColumn("AccountStatus",typeof(String)),
                      new DataColumn("ChgPasswdNxtLogin",typeof(String)),
                  };

            Table_MergeUserData.Columns.AddRange(colsMerge);
            Table_MergeUserData.PrimaryKey = new DataColumn[] { Table_MergeUserData.Columns["wID"] };
        }

        private static void ShowTable(DataTable table)
        {
            foreach (DataColumn col in table.Columns)
            {
                Console.Write("{0,-14}", col.ColumnName);
            }
            Console.WriteLine();

            foreach (DataRow row in table.Rows)
            {
                foreach (DataColumn col in table.Columns)
                {
                    if (col.DataType.Equals(typeof(DateTime)))
                        Console.Write("{0,-14:d}", row[col]);
                    else if (col.DataType.Equals(typeof(Decimal)))
                        Console.Write("{0,-14:C}", row[col]);
                    else
                        Console.Write("{0,-14}", row[col]);
                }
                Console.WriteLine();
            }
            Console.WriteLine();
        }

      private void Button1_Click(object sender, EventArgs e)
        {
            string srcFilePathWifi = @"c:\WifiUserData.csv";
            string srcFilePathSales = @"c:\SalesUserData.csv";

            CreateTableSales();
            InsertTableSales(srcFilePathSales);

            CreateTableWifi();
            InsertTableWifi(srcFilePathWifi);

            ShowTable(Table_WifiUserData);
            ShowTable(Table_SalesUserData);

            // Set the relations between the tables and create the related constraint.
            setSalesWifi.Relations.Add("Table_WifiUserData", Table_SalesUserData.Columns["wID"], Table_SalesUserData.Columns["UserID"], true);

        }

    }
}

WifiUserData.csv:

wID           username      fname         lastname      email         empid         lastlogintime 
msmith        marysmith     mary          smith         marysmith@company.com10001         24/01/2019 14:00
jbloggs       joebloggs     joe           bloggs        joebloggs@company.com10002         10/01/2019 9:00
pgolightly    petergolightlypeter         golightly     petergolightly@company.com10003         20/01/2019 17:00
rrabbit       rogerrabbit   roger         rabbit        rogerrabbit@company.com10004         1/02/2019 14:00

SalesUserData.csv:

UserID        Alias         UserType      AccountStatus ChgPasswdNxtLogin
msmith        mary smith    Manager       No            No            
jbloggs       joe bloggs    Standard      No            No            
pgolightly    peter golightlyJunior        No            No            
rrabbit       roger rabbit  Standard      No            No   

К чему я стремлюсь:

UserID  Alias   UserType    AccountStatus   ChgPasswdNxtLogin   username    fname   lastname    email   empid   lastlogintime
msmith  mary smith  Manager No  No  marysmith   mary    smith   marysmith@company.com 10001 24/01/2019 14:00
jbloggs joe bloggs  Standard    No  No  joebloggs   joe bloggs  joebloggs@company.com 10002 10/01/2019 9:00
pgolightly  peter golightly Junior  No  No  petergolightly  peter   golightly   petergolightly@company.com 10003    20/01/2019 17:00
rrabbit roger rabbit    Standard    No  No  rogerrabbit roger   rabbit  rogerrabbit@company.com 10004   1/02/2019 14:00

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

@ jdweng ... еще раз спасибо :) Я оглянулся назад на историю своего браузера и, кажется, за последнюю неделю я просмотрел более 173 страниц, касающихся проблемы, прежде чем приехал сюда, поэтому я рад, что яне случайно потратил время, спрашивая!Итак, вот окончательный (ПОЛНЫЙ) результат и код, основанный на использовании ответа # jdweng.

Я опубликую весь код, так как я действительно страстно не люблю его, когда люди получают исправления и не публикуют то, что они придумали, следовательно, после 173 страниц и без радости !.Может быть, это поможет кому-то еще с той же проблемой в уродстве.

1) Окончательный результат (console.writeline) выглядит следующим образом:

//------- MergeUserData--------------//
wID           username      fname         lastname      email         empid         lastlogintime UserID        Alias         UserType      AccountStatus ChgPasswdNxtLogin
msmith        marysmith     mary          smith         marysmith@company.com10001         24/01/2019 14:00msmith        mary smith    Manager       No            No            
jbloggs       joebloggs     joe           bloggs        joebloggs@company.com10002         10/01/2019 9:00jbloggs       joe bloggs    Standard      No            No            
pgolightly    petergolightlypeter         golightly     petergolightly@company.com10003         20/01/2019 17:00pgolightly    peter golightlyJunior        No            No            
rrabbit       rogerrabbit   roger         rabbit        rogerrabbit@company.com10004         1/02/2019 14:00rrabbit       roger rabbit  Standard      No            No  

2) конечный CreateTableReport() выглядит следующим образом (проверено UAT пройдено):

 public void CreateTableReport()
        {

            DataColumn[] colsMerge ={
                      new DataColumn("wID",typeof(String)),      //--- Below foreach from table: sales
                      new DataColumn("username",typeof(String)), //--- Below foreach from table: wifi
                      new DataColumn("fname",typeof(String)),    //--- Below foreach from table: wifi
                      new DataColumn("lastname",typeof(String)), //--- Below foreach from table: wifi
                      new DataColumn("email",typeof(String)),    //--- Below foreach from table: wifi
                      new DataColumn("empid",typeof(String)),    //--- Below foreach from table: wifi
                      new DataColumn("lastlogintime",typeof(String)), //--- Below foreach from table: wifi
                      new DataColumn("UserID",typeof(String)),   //--- Below foreach from table: sales
                      new DataColumn("Alias",typeof(String)),    //--- Below foreach from table: sales
                      new DataColumn("UserType",typeof(String)), //--- Below foreach from table: sales
                      new DataColumn("AccountStatus",typeof(String)), //--- Below foreach from table: sales
                      new DataColumn("ChgPasswdNxtLogin",typeof(String)), //--- Below foreach from table: sales
                  };

            Table_MergeUserData.Columns.AddRange(colsMerge);

            var mergedData = (from s in Table_SalesUserData.AsEnumerable()
                              join w in Table_WifiUserData.AsEnumerable() on s.Field<string>("UserID") equals w.Field<string>("wID")
                              select new { sales = s, wifi = w }).ToList();

            foreach (var data in mergedData)
            {
                Table_MergeUserData.Rows.Add(new object[] {
                    data.sales.Field<string>("UserID"),
                    data.wifi.Field<string>("username"),
                    data.wifi.Field<string>("fname"),
                    data.wifi.Field<string>("lastname"),
                    data.wifi.Field<string>("email"),
                    data.wifi.Field<string>("empid"),
                    data.wifi.Field<string>("lastlogintime"),
                    data.sales.Field<string>("UserID"),
                    data.sales.Field<string>("Alias"),
                    data.sales.Field<string>("UserType"),
                    data.sales.Field<string>("AccountStatus"),
                    data.sales.Field<string>("ChgPasswdNxtLogin")
                });

            }

3) А теперь для всего анчелада, или как это пишется.

Весь Form1.csv, использующий все те же файлы CSV, которые были добавлены изначально, и ...... код синтаксического анализатора CSV для импорта обоих файлов CSV.Надеюсь, что это поможет кому-то еще в будущем.Все это было сделано в сообществе Visual Studio 2019 со всеми библиотеками и т. Д. В разделе «Использование».

«Form1» - это базовая форма с одной кнопкой «Показать таблицу».Я получил основную часть этого из большого / простого урока из msdn: https://docs.microsoft.com/en-us/visualstudio/ide/tutorial-1-create-a-picture-viewer?view=vs-2019.

Если вы являетесь новичком для Visual Studio, как я, это действительно здорово.За 1 раз в неделю я научился делать это руководство, а затем регрессировал свои сценарии linux и Powershell для выполнения поиска LDAP, объединения данных, импорта рабочих книг XLS, экспорта в CSV, повторного импорта файлов CSV и теперь с помощью сообщества переполнения стека (jdwen) присоединяйся к dataTables и создай что-нибудь полезное.Счастью нет границ!:)))

Хорошо, достаточно от меня, вот и все:

//========================================//
//--- Useful Pages to check out ----------//
//========================================//
//--- https://immortalcoder.blogspot.com/2013/12/convert-csv-file-to-datatable-in-c.html
//--- https://code.msdn.microsoft.com/How-to-create-DataTable-7abb4914
//--- https://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader
//--- https://www.dotnetperls.com/datatable
//--- https://docs.microsoft.com/en-us/dotnet/api/system.data.datatable?view=netframework-4.8#examples


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Text.RegularExpressions;
using GenericParsing;


namespace GenericParserv1._1._6
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }

        DataTable Table_SalesUserData = new DataTable("SalesUserData");
        DataTable Table_WifiUserData = new DataTable("WifiUserData");
        DataTable Table_MergeUserData = new DataTable("MergeUserData");
        DataSet   setSalesWifi = new DataSet();


        private static void ShowTable(DataTable table)
        {
            Console.WriteLine("//------- " + table + "--------------//");

            foreach (DataColumn col in table.Columns)
            {
                Console.Write("{0,-14}", col.ColumnName);
            }
            Console.WriteLine();

            foreach (DataRow row in table.Rows)
            {
                foreach (DataColumn col in table.Columns)
                {
                    if (col.DataType.Equals(typeof(DateTime)))
                        Console.Write("{0,-14:d}", row[col]);
                    else if (col.DataType.Equals(typeof(Decimal)))
                        Console.Write("{0,-14:C}", row[col]);
                    else
                        Console.Write("{0,-14}", row[col]);
                }
                Console.WriteLine();
            }
            Console.WriteLine();
        }


        public void CreateTableSales()
        {
            DataColumn[] colsSales ={
                      new DataColumn("UserID",typeof(String)),
                      new DataColumn("Alias",typeof(String)),
                      new DataColumn("UserType",typeof(String)),
                      new DataColumn("AccountStatus",typeof(String)),
                      new DataColumn("ChgPasswdNxtLogin",typeof(String)),
                  };
            Table_SalesUserData.Columns.AddRange(colsSales);
            Table_SalesUserData.PrimaryKey = new DataColumn[] { Table_SalesUserData.Columns["UserID"] };
            setSalesWifi.Tables.Add(Table_SalesUserData);

        }

        public void InsertTableSales(string srcFilePathSales)
        {
            string Sales_UserID,
            Sales_Alias,
            Sales_UserType,
            Sales_AccountStatus,
            Sales_ChgPasswdNxtLogin
            ;

            using (GenericParser parser = new GenericParser())
            {
                parser.SetDataSource(srcFilePathSales);

                parser.ColumnDelimiter = ','; //---- For TAB DELIM USE: parser.ColumnDelimiter = "\t".ToCharArray();
                parser.FirstRowHasHeader = true;
                parser.SkipStartingDataRows = 0;
                parser.MaxBufferSize = 4096;
                parser.MaxRows = 500;
                parser.TextQualifier = null;

                while (parser.Read())
                {

                    Sales_UserID = parser["UserID"];
                    Sales_Alias = parser["Alias"];
                    Sales_UserType = parser["UserType"];
                    Sales_AccountStatus = parser["AccountStatus"];
                    Sales_ChgPasswdNxtLogin = parser["ChgPasswdNxtLogin"];


                    Object[] rows = {


                        new Object[]{
                                    Sales_UserID
                                    ,Sales_Alias
                                    ,Sales_UserType
                                    ,Sales_AccountStatus
                                    ,Sales_ChgPasswdNxtLogin
                        }
                     };

                    foreach (Object[] row in rows)
                    {
                        Table_SalesUserData.Rows.Add(row);
                    }

                }

            }

        }

        public void CreateTableWifi()
        {

            DataColumn[] colsWifi ={
                      new DataColumn("wID",typeof(String)),
                      new DataColumn("username",typeof(String)),
                      new DataColumn("fname",typeof(String)),
                      new DataColumn("lastname",typeof(String)),
                      new DataColumn("email",typeof(String)),
                      new DataColumn("empid",typeof(String)),
                      new DataColumn("lastlogintime",typeof(String))
                  };

            Table_WifiUserData.Columns.AddRange(colsWifi);
            Table_WifiUserData.PrimaryKey = new DataColumn[] { Table_WifiUserData.Columns["wID"] };
            setSalesWifi.Tables.Add(Table_WifiUserData);

        }

        public void InsertTableWifi(string srcFilePathWifi)
        {

            string Wifi_wID, Wifi_username, Wifi_fname, Wifi_lastname, Wifi_email, Wifi_empid, Wifi_lastlogintime;

            using (GenericParser parser = new GenericParser())
            {
                parser.SetDataSource(srcFilePathWifi);

                parser.ColumnDelimiter = ','; //---- For TAB DELIM USE: parser.ColumnDelimiter = "\t".ToCharArray();
                parser.FirstRowHasHeader = true;
                parser.SkipStartingDataRows = 0;
                parser.MaxBufferSize = 4096;
                parser.MaxRows = 500;
                parser.TextQualifier = null;

                while (parser.Read())
                {

                    Wifi_wID = parser["wID"];
                    Wifi_username = parser["username"];
                    Wifi_fname = parser["fname"];
                    Wifi_lastname = parser["lastname"];
                    Wifi_email = parser["email"];
                    Wifi_empid = parser["empid"];
                    Wifi_lastlogintime = parser["lastlogintime"];

                    Object[] rows = {


                        new Object[]{
                                    Wifi_wID
                                    ,Wifi_username
                                    ,Wifi_fname
                                    ,Wifi_lastname
                                    ,Wifi_email
                                    ,Wifi_empid
                                    ,Wifi_lastlogintime
                        }
                     };

                    foreach (Object[] row in rows)
                    {
                        Table_WifiUserData.Rows.Add(row);
                    }

                }

            }
        }

         public void CreateTableReport()
        {

            DataColumn[] colsMerge ={
                      new DataColumn("wID",typeof(String)),      //--- Below foreach from table: sales
                      new DataColumn("username",typeof(String)), //--- Below foreach from table: wifi
                      new DataColumn("fname",typeof(String)),    //--- Below foreach from table: wifi
                      new DataColumn("lastname",typeof(String)), //--- Below foreach from table: wifi
                      new DataColumn("email",typeof(String)),    //--- Below foreach from table: wifi
                      new DataColumn("empid",typeof(String)),    //--- Below foreach from table: wifi
                      new DataColumn("lastlogintime",typeof(String)), //--- Below foreach from table: wifi
                      new DataColumn("UserID",typeof(String)),   //--- Below foreach from table: sales
                      new DataColumn("Alias",typeof(String)),    //--- Below foreach from table: sales
                      new DataColumn("UserType",typeof(String)), //--- Below foreach from table: sales
                      new DataColumn("AccountStatus",typeof(String)), //--- Below foreach from table: sales
                      new DataColumn("ChgPasswdNxtLogin",typeof(String)), //--- Below foreach from table: sales
                  };

            Table_MergeUserData.Columns.AddRange(colsMerge);

            var mergedData = (from s in Table_SalesUserData.AsEnumerable()
                              join w in Table_WifiUserData.AsEnumerable() on s.Field<string>("UserID") equals w.Field<string>("wID")
                              select new { sales = s, wifi = w }).ToList();

            foreach (var data in mergedData)
            {
                Table_MergeUserData.Rows.Add(new object[] {
                    data.sales.Field<string>("UserID"),
                    data.wifi.Field<string>("username"),
                    data.wifi.Field<string>("fname"),
                    data.wifi.Field<string>("lastname"),
                    data.wifi.Field<string>("email"),
                    data.wifi.Field<string>("empid"),
                    data.wifi.Field<string>("lastlogintime"),
                    data.sales.Field<string>("UserID"),
                    data.sales.Field<string>("Alias"),
                    data.sales.Field<string>("UserType"),
                    data.sales.Field<string>("AccountStatus"),
                    data.sales.Field<string>("ChgPasswdNxtLogin")
                });

            }

        }


        private void Button1_Click(object sender, EventArgs e)
        {
            string srcFilePathWifi = @"C:\WifiUserData.csv";
            string srcFilePathSales = @"C:\SalesUserData.csv";

            CreateTableSales();
            InsertTableSales(srcFilePathSales);

            CreateTableWifi();
            InsertTableWifi(srcFilePathWifi);

            ShowTable(Table_WifiUserData);
            ShowTable(Table_SalesUserData);

            CreateTableReport();
            ShowTable(Table_MergeUserData);

        }
    }
}

0 голосов
/ 27 июня 2019

Попробуйте следующее.Я поместил один столбец в объединенную таблицу, а остальное оставил вам.:

       public void CreateTableReport()
        {

            DataColumn[] colsMerge ={
                      new DataColumn("wID",typeof(String)),
                      new DataColumn("username",typeof(String)),
                      new DataColumn("fname",typeof(String)),
                      new DataColumn("lastname",typeof(String)),
                      new DataColumn("email",typeof(String)),
                      new DataColumn("empid",typeof(String)),
                      new DataColumn("lastlogintime",typeof(String)),
                      new DataColumn("UserID",typeof(String)),
                      new DataColumn("Alias",typeof(String)),
                      new DataColumn("UserType",typeof(String)),
                      new DataColumn("AccountStatus",typeof(String)),
                      new DataColumn("ChgPasswdNxtLogin",typeof(String)),
                  };

            Table_MergeUserData.Columns.AddRange(colsMerge);

            var mergedData = (from s in Table_SalesUserData.AsEnumerable()
                              join w in Table_WifiUserData.AsEnumerable() on s.Field<string>("UserID") equals w.Field<string>("wID")
                              select new { sales = s, wifi = w }).ToList();

            foreach (var data in mergedData)
            {
                Table_MergeUserData.Rows.Add(new object[] {
                    data.sales.Field<string>("wID")
                });
            }

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