C# 将CSV解析到数据库并返回
我目前正处于项目的规划阶段,我们必须让我们的软件与其他客户系统协同工作 其中一个系统用于管理其业务中的订单,我们需要有关库存的信息。遗憾的是,它们没有API,用户只能手动导出CSV文件 关于如何将此CSV数据导入我们的应用程序,我无法想出最佳解决方案。目前,我所能想到的只是一个手动CSV上传功能,我们可以使用它将数据解析到数据库中。 主要问题是,我们对数据所做的任何更改都必须放回他们的系统中,目前也通过CSV上传。我们没有收到任何参考数据或任何有助于我们准确绘制数据的信息。所有这些都是基于这样一个事实,即它必须跨多个设备工作,可能是同时工作 有人能告诉我解决这个问题的方法吗?如果有必要,我是否应该尝试扩展这个项目,并建议他们开发一个APIC# 将CSV解析到数据库并返回,c#,asp.net,database,software-design,C#,Asp.net,Database,Software Design,我目前正处于项目的规划阶段,我们必须让我们的软件与其他客户系统协同工作 其中一个系统用于管理其业务中的订单,我们需要有关库存的信息。遗憾的是,它们没有API,用户只能手动导出CSV文件 关于如何将此CSV数据导入我们的应用程序,我无法想出最佳解决方案。目前,我所能想到的只是一个手动CSV上传功能,我们可以使用它将数据解析到数据库中。 主要问题是,我们对数据所做的任何更改都必须放回他们的系统中,目前也通过CSV上传。我们没有收到任何参考数据或任何有助于我们准确绘制数据的信息。所有这些都是基于这样一
非常感谢。这里有太多的变量,所以我只能给你一些一般性的建议 这取决于客户端系统中的信息需要的最新程度。如果客户希望应用程序中的订单几乎立即出现在他们的系统中,那么最好构建一个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功能,让他们手动将数据上传回系统。他们的数据库模式目前已完全锁定,希望在下周也能访问。再次感谢。