C# 将CSV解析到数据库并返回

C# 将CSV解析到数据库并返回,c#,asp.net,database,software-design,C#,Asp.net,Database,Software Design,我目前正处于项目的规划阶段,我们必须让我们的软件与其他客户系统协同工作 其中一个系统用于管理其业务中的订单,我们需要有关库存的信息。遗憾的是,它们没有API,用户只能手动导出CSV文件 关于如何将此CSV数据导入我们的应用程序,我无法想出最佳解决方案。目前,我所能想到的只是一个手动CSV上传功能,我们可以使用它将数据解析到数据库中。 主要问题是,我们对数据所做的任何更改都必须放回他们的系统中,目前也通过CSV上传。我们没有收到任何参考数据或任何有助于我们准确绘制数据的信息。所有这些都是基于这样一

我目前正处于项目的规划阶段,我们必须让我们的软件与其他客户系统协同工作

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

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

有人能告诉我解决这个问题的方法吗?如果有必要,我是否应该尝试扩展这个项目,并建议他们开发一个API


非常感谢。

这里有太多的变量,所以我只能给你一些一般性的建议

这取决于客户端系统中的信息需要的最新程度。如果客户希望应用程序中的订单几乎立即出现在他们的系统中,那么最好构建一个API,但根据客户使用的是什么,API可能很难实现

如果您想保持低成本并使用CSV,您必须将应用程序中的任何数据更改导出到CSV文件,然后将CSV文件传输到客户端系统可以获取并导入的位置。这最好在设定的时间间隔内完成,具体取决于订单的发送频率(可以是每5分钟,甚至每24小时一次)

导入过程可以通过shell脚本等系统脚本实现自动化。此外,您还需要从客户端系统设置一个导出,然后您的应用程序将使用该导出更新自己的信息。这也可以由系统脚本管理

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


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

您必须拥有与源代码共享的一致模式,否则无法很好地解析自由文本

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=日期时间
Col2=帐户ID文本
Col3=子科目文本
Col4=市场代码文本
Col5=安全代码文本
Col6=单个单元


参考:

有很多方法可以做到这一点,但仅仅是因为你没有提供足够的信息……在我看来。。。不管怎样,像这样的事情怎么样,开始吧

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();
            }
        }
        }
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Windows.Forms;
使用System.IO;
使用System.Data.SqlClient;
使用Excel=Microsoft.Office.Interop.Excel;
命名空间将\u CSV\u文件\u导入到\u DataGridView
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
私有无效btnBrowse\u单击(对象发送者,事件参数)
{
OpenFileDialog dlg=新建OpenFileDialog();
DialogResult dlgResult=dlg.ShowDialog();
if(dlgResult==DialogResult.OK)
{
Text=dlg.FileName;
}
}
私有void btnLoadData_单击(对象发送者,事件参数e)
{
字符串行值;
字符串[]单元格值;
if(System.IO.File.Exists(txtPath.Text))
{
System.IO.StreamReader StreamReader=新的StreamReader(txtPath.Text);
//读头
rowValue=streamReader.ReadLine();
cellValue=rowValue.Split(',');

对于(int i=0;我感谢您的回答。我本周五有一个关于项目的会议,因此将询问他们关于API的问题。我认为您在设定的时间间隔方面是正确的。他们是一个大企业,我认为使用CSV可能是一个问题,因为项目范围和当前的系统。我们将在我们自己的系统中提供API,并且应用导出到CSV功能,让他们手动将数据上传回系统。他们的数据库模式目前已完全锁定,希望在下周也能访问。再次感谢。