将CSV解析为数据库并返回

时间:2018-07-01 23:24:55

标签: c# asp.net database software-design

我目前正处于项目的计划阶段,我们必须使我们的软件与其他客户端系统一起使用。

这些系统之一是用于管理其业务范围内的订单,我们需要有关库存的信息。遗憾的是,它们没有API,用户只能手动导出CSV文件。

关于如何将CSV数据导入我们的应用程序,我无法提出最佳解决方案。目前,我所能想到的只是一个手动CSV上传功能,我们可以使用该功能将数据解析到我们的数据库中。 主要的问题是,我们对数据所做的任何更改都必须放回系统中,目前也要通过CSV上传。我们没有提供参考数据或任何有助于我们准确映射数据的信息。所有这些都是基于它必须跨多个设备(可能同时运行)的事实。

任何人都可以给我一个解决该问题的方法的想法,如有必要,我是否应该尝试扩展该项目并建议他们开发API?

非常感谢。

3 个答案:

答案 0 :(得分:1)

这里的变量太多,所以我只能给您一些通用的建议。

这取决于客户端系统中信息的最新程度。如果客户希望应用程序中发出的订单几乎立即显示在他们的系统中,则构建API可能更好,但是根据客户的使用情况,API可能会很困难。

如果您想降低成本并使用CSV,则必须将对应用程序所做的所有数据更改导出到CSV文件,然后将CSV文件传输到客户端系统可以抓取并导入的位置。最好在设定的时间间隔内完成此操作,具体时间取决于订单需要经过的频率(可能每5分钟甚至每24小时一次)。

可以通过系统脚本(例如Shell脚本)自动执行导入过程。同样,您还需要从客户端系统设置导出,然后您的应用将使用该导出来更新自己的信息,这也可以由系统脚本进行管理。

使用系统脚本导入/导出物理文件,然后使用您的应用程序在系统之间移动数据。

如果选择进行CSV导入/导出,则映射是必不可少的,则需要调查客户端系统成功导入所需的内容,并且需要使应用程序输出符合这些要求。

答案 1 :(得分:0)

必须具有与您和源代码共享的一致架构,否则您迷宫地解析自由文本。

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 = dd MM yyyy hh:nn:ss

     

Col1 =日期DateTime
  Col2 = AccountID文字
  Col3 =子帐户文字
  Col4 = MarketCode文字
  Col5 =安全码文字
  Col6 =单个单元

参考:Missing column of Dates in CSV file using Schema.ini file

答案 2 :(得分:0)

有很多方法可以解决此问题,但这仅仅是因为您没有提供足够的信息...我认为...无论如何,这样的事情如何开始使用

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

您还可以执行许多其他操作。如有其他问题,请发回。