Парсинг CSV в базу данных и обратно - PullRequest
0 голосов
/ 02 июля 2018

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

Одна из этих систем предназначена для управления заказами в рамках их бизнеса, и нам нужна информация о запасах. К сожалению, у них нет API, и пользователи могут только вручную экспортировать файл CSV.

Я не могу найти лучшее решение о том, как передать эти CSV-данные в наше приложение. На данный момент все, о чем я могу думать, это функция ручной загрузки CSV, которую мы можем использовать для анализа данных в нашей базе данных. Основная проблема заключается в том, что любые изменения, которые мы вносим в данные, должны быть возвращены в их систему, которая в настоящее время также загружается в CSV. Нам не предоставлены справочные данные или что-либо, что поможет нам точно отобразить данные. Все это в дополнение к тому факту, что он должен работать на нескольких устройствах, возможно, одновременно.

Может ли кто-нибудь дать мне представление о том, какой путь выбрать для решения этой проблемы, и, если необходимо, я должен попытаться расширить проект и порекомендовать им разработать API?

Заранее большое спасибо.

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

Вы должны иметь некоторую согласованную схему с вами и исходным ресурсом, в противном случае вы хорошо разберетесь в разборе свободного текста.

DataTable csvTableSchema = new DataTable();

//Open the CSV
string csvFilePath = "C:\\temp\\A.csv";
var connString = string.Format(
    @"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=YES;FMT=Delimited""",
    Path.GetDirectoryName(csvFilePath)
);

//To read the csv with DataTypes we specify the columns and their datatypes in the Schema.ini
//REF https://docs.microsoft.com/en-us/sql/odbc/microsoft/schema-ini-file-text-file-driver

using (var conn = new OleDbConnection(connString))
{
    conn.Open();
    var query = "SELECT * FROM [" + Path.GetFileName(csvFilePath) + "]";
    using (var adapter = new OleDbDataAdapter(query, conn))
    {
        var ds = new DataSet("CSV File");
        adapter.Fill(ds);
        csvTableSchema = ds.Tables[0];
    }
}

Файл Schema.ini находится в том же каталоге, что и CSV, который вы читаете, вам нужно указать это для справочных данных, чтобы позволить вам точно отобразить данные, например:

[ABC_20171128.csv]
Формат = с разделителями (|)
CharacterSet = ANSI
ColNameHeader = True
DateTimeFormat = дд мм гггг чч: нн: сс

Col1 = Дата DateTime
Col2 = AccountID Text
Col3 = текст дополнительного аккаунта
Col4 = Текст MarketCode
Col5 = текст кода безопасности
Col6 = Единичные единицы

Ссылка: Отсутствует столбец Даты в файле CSV с использованием файла Schema.ini

0 голосов
/ 06 июля 2018

Есть много способов сделать это, но только потому, что вы не предоставили достаточно информации ... на мой взгляд ... Во всяком случае, что-то вроде этого, чтобы начать.

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;
using Excel = Microsoft.Office.Interop.Excel; 

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

        private void btnBrowse_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            DialogResult dlgResult = dlg.ShowDialog();
            if (dlgResult == DialogResult.OK)
            {
                txtPath.Text = dlg.FileName;
            }
        }

        private void btnLoadData_Click(object sender, EventArgs e)
        {
            string rowValue;
            string[] cellValue;

            if (System.IO.File.Exists(txtPath.Text))
            {
                System.IO.StreamReader streamReader = new StreamReader(txtPath.Text);

                // Reading header
                rowValue = streamReader.ReadLine();
                cellValue = rowValue.Split(',');                
                for (int i = 0; i <= cellValue.Count() - 1; i++)
                {
                    DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();
                    column.Name = cellValue[i];
                    column.HeaderText = cellValue[i];
                    dataGridView1.Columns.Add(column);
                }

                // Reading content
                while (streamReader.Peek() != -1)
                {
                    rowValue = streamReader.ReadLine();
                    cellValue = rowValue.Split(',');
                    dataGridView1.Rows.Add(cellValue);
                }

                streamReader.Close();
            }
            else
            {
                MessageBox.Show("No File is Selected");
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Excel.Application xlApp ;
            Excel.Workbook xlWorkBook ;
            Excel.Worksheet xlWorkSheet ;
            object misValue = System.Reflection.Missing.Value;

            xlApp = new Excel.Application();
            xlWorkBook = xlApp.Workbooks.Add(misValue);
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
            int i = 0;
            int j = 0; 

            for (i = 0; i <= dataGridView1.RowCount  - 1; i++)
            {
                for (j = 0; j <= dataGridView1.ColumnCount  - 1; j++)
                {
                    DataGridViewCell cell = dataGridView1[j, i];
                    xlWorkSheet.Cells[i + 1, j + 1] = cell.Value;
                }
            }

            xlWorkBook.SaveAs("C:\\Users\\Excel\\Desktop\\test.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
            xlWorkBook.Close(true, misValue, misValue);
            xlApp.Quit();

            releaseObject(xlWorkSheet);
            releaseObject(xlWorkBook);
            releaseObject(xlApp);

            MessageBox.Show("Excel file created , you can find the file C:\\Users\\Excel\\Desktop\\test.xls");
        }

        private void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                MessageBox.Show("Exception Occured while releasing object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
            }
        }
        }
}

enter image description here

Есть много других вещей, которые вы можете сделать. Отправьте ответ, если у вас есть дополнительные вопросы.

0 голосов
/ 02 июля 2018

Здесь так много переменных, что я могу дать вам только общие советы.

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

Если вы хотите сохранить низкую стоимость и использовать CSV, вам придется экспортировать любые изменения данных, сделанные в вашем приложении, в файл CSV, а затем перенести файл CSV в то место, куда система клиентов сможет его захватить и импортировать. Лучше всего это делать через установленные промежутки времени, в зависимости от того, как часто должны поступать заказы (может быть каждые 5 минут или даже каждые 24 часа).

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

Используйте системные сценарии для импорта / экспорта физического файла, а затем используйте приложение для перемещения данных между системами.

Если вы решите импортировать / экспортировать в CSV, сопоставление имеет важное значение, вам нужно выяснить, что требуется клиентской системе для успешного импорта, и вам нужно, чтобы выходные данные приложения соответствовали этим требованиям.

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