我目前正处于项目的计划阶段,我们必须使我们的软件与其他客户端系统一起使用。
这些系统之一是用于管理其业务范围内的订单,我们需要有关库存的信息。遗憾的是,它们没有API,用户只能手动导出CSV文件。
关于如何将CSV数据导入我们的应用程序,我无法提出最佳解决方案。目前,我所能想到的只是一个手动CSV上传功能,我们可以使用该功能将数据解析到我们的数据库中。 主要的问题是,我们对数据所做的任何更改都必须放回系统中,目前也要通过CSV上传。我们没有提供参考数据或任何有助于我们准确映射数据的信息。所有这些都是基于它必须跨多个设备(可能同时运行)的事实。
任何人都可以给我一个解决该问题的方法的想法,如有必要,我是否应该尝试扩展该项目并建议他们开发API?
非常感谢。
答案 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:ssCol1 =日期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();
}
}
}
}
您还可以执行许多其他操作。如有其他问题,请发回。