цикл по столбцам из CSV-файла и использование его в качестве параметра для запроса PostgreSQL - PullRequest
0 голосов
/ 11 октября 2019

У меня есть файл CSV с этим форматом

Subject_ID
3
4
5
6
34
65
6534

Я хочу написать цикл кода C # для этого файла CSV и вернуть эти данные в соответствии с номером субъекта, как в следующем запросе

 select * from chartevents c where c.itemid In(21,30006,490)and c.subject_id=@ID 

В C # я пишу этот код // читать столбец из CSV

 foreach (string csvLines in File.ReadAllLines("C:\path"))
                {
                    //Here  csvItem is each Line in the CSV file
                    string[] csvItems = csvLines.Split(',').ToArray();
                     var patient_num = csvItems[0];


                }


      **// creating the connection string (Server, Port, User id, password, database)** string conStr = "Server=127.0.0.1; Port=5432; User Id=postgres; Password=postgres; Database=mimic;";

  NpgsqlConnection conn = new NpgsqlConnection(conStr);
 string comStr = "select * from chartevents c where c.itemid In(211,220045,618,220210,220277,220050,220052,220180,223900,723,223901,454,"               "184,220739,3655,676,223762,223761,3420,2981,813,220545,225651,4948,828,30006,490)and c.subject_id=@ID;

  NpgsqlParameter param = new NpgsqlParameter();
   param.ParameterName = "@ID";

                NpgsqlCommand com = new NpgsqlCommand(comStr, conn);
                com.Parameters.Add(param);

                NpgsqlDataAdapter ad = new NpgsqlDataAdapter(com);
                DataTable dt = new DataTable();
                Console.WriteLine("Conection to server established successfuly \n");
                // check if connection is open or not
                if (conn != null && conn.State == ConnectionState.Open)
                {
                    Console.WriteLine("Connection Open");
                    conn.Close();
                }
                else
                {
                    conn.Open();
                }



        //// Fill data table with data and start reading
            //function to loop on subject_id values and execute query based on value of subject id then save results
            //    in csv and concatenate other value in the csv file for every for loo[iteration]

            //for loop
            //  {

            //ad.Fill(dt);
            //NpgsqlDataReader dRead = com.ExecuteReader();


            //}

          try
                {
                    Console.WriteLine("Contents of table in database: \n");
                    while (dRead.Read())
                    {
                        foreach (DataRow row in dt.Rows)
                        {
                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                                Console.Write("{0} \t \n", row[i].ToString());
 // how to save return data to csv file 
                            }
                        }
                    }
                }
                catch (NpgsqlException ne)
                {
                    Console.WriteLine("Problem connecting to server, Error details {0}", ne.ToString());
                }
                finally
                {
                    Console.WriteLine("Closing connections");
                    dRead.Close();
                    dRead = null;
                    conn.Close();
                    conn = null;
                    com.Dispose();
                    com = null;
                }
            }
        }
    }

Пожалуйста, я хочу, чтобы кто-нибудь помог мне в написании комментариевфункция, которая выполняет запрос на основе параметра субъекта и сохраняет каждый результат в CSV-файле

1 Ответ

0 голосов
/ 11 октября 2019
string fileCSV = "file.csv";
var lines = File.ReadAllLines(fileCSV).Skip(1); //Read Lines and Skip header 
string conStr = "[Your connection string]"; 

using (NpgsqlConnection conn = new NpgsqlConnection(conStr))
{
    conn.Open();

    foreach (string line in lines)
    {
        if (!String.IsNullOrWhiteSpace(line))
        {
            string comStr = "select * from chartevents c where c.itemid In (211,220045,618,220210,220277,220050,220052,220180,223900,723,223901,454,184,220739,3655,676,223762,223761,3420,2981,813,220545,225651,4948,828,30006,490)and c.subject_id=@ID;";
            using (NpgsqlCommand cmd = new NpgsqlCommand(comStr, conn))
            {
                cmd.Parameters.Add(new NpgsqlParameter("@Id", line));
                using (NpgsqlDataReader r = cmd.ExecuteReader())
                {
                    using (TextWriter tw = new StreamWriter("ID_" + line + ".csv", false, Encoding.Default))
                    {
                        if (r.Read())
                        {
                            //Write Columns header
                            foreach (DataRow c in r.GetSchemaTable().Rows)
                            {
                                tw.Write(c[0].ToString() + ";");
                            }
                            tw.Write("\r\n");
                            //Write Rows
                            do
                            {
                                foreach (DataRow c in r.GetSchemaTable().Rows)
                                {
                                    string column = c[0].ToString();
                                    object o = r[column];
                                    if (o == null)
                                    {
                                        tw.Write(";");
                                    }
                                    else
                                    {
                                        tw.Write(o.ToString() + ";");
                                    }

                                }
                                tw.Write("\r\n");
                            } while (r.Read());
                        }

                    }
                }
                //reader is closed
            }
            //cmd is disposed
        }
    }
}
//connection is closed
...