将逗号分隔数据导入数据表

时间:2010-08-26 14:07:54

标签: c# sql-server

通过Web应用程序将CSV导入数据库的最简单方法是什么?

更新:

CSV的小例子:

stop_id, stop_name, stop_desc, stop_lat, stop_lon, zone_id, stop_url
TR, Trenton, , 40.2177778, -74.7550000, 6, 
LVTN, Levittown-Tullytown, , 40.1402778, -74.8169444, 5, 
BRST, Bristol, , 40.1047222, -74.8547222, 4, 
CROY, Croydon, , 40.0936111, -74.9066667, 4, 
EDGT, Eddington, , 40.0830556, -74.9336111, 4, 
CORN, Cornwells Heights, , 40.0716667, -74.9522222, 3, 
TORR, Torresdale, , 40.0544444, -74.9844444, 3, 
HOLM, Holmesburg Jct, , 40.0327778, -75.0236111, 2, 

2 个答案:

答案 0 :(得分:1)

如果您使用Portable and Efficient Generic Parser for Flat Files并创建一个引用它的新Visual C#控制台应用程序,则以下代码会将CSV文件的内容加载到DataTable中:

using GenericParsing;
using System.Data;

namespace CsvToDataTable
{
    public class Program
    {
        static void Main(string[] args)
        {
            var pathOfCsvFile = @"C:\MyFile.csv";
            var adapter = new GenericParsing.GenericParserAdapter(pathOfCsvFile);
            DataTable data = adapter.GetDataTable();
        }
    }
}

下一步是将data中的数据保存到数据库服务器。此代码假定CSV文件的结构与数据库中名为TableName的表的完全匹配:

private static void SaveDataToDatabase(DataTable data)
{
    var connectionString = "CONNECTION STRING GOES HERE";
    var commandText = "INSERT INTO [databasename].[dbo].[TableName] " +
        "(stop_id, stop_name, stop_desc, stop_lat, stop_lon, zone_id, stop_url) " +
        "VALUES (@stop_id, @stop_name, @stop_desc, @stop_lat, @stop_lon, @zone_id, @stop_url)";

    using (var connection = new SqlConnection(connectionString))
    {
        connection.Open();
        foreach (DataRow row in data.Rows)
        {
            using (var command = new SqlCommand(commandText, connection))
            {
                command.Parameters.AddWithValue("@stop_id", row["stop_id"]);
                command.Parameters.AddWithValue("@stop_name", row["stop_name"]);
                command.Parameters.AddWithValue("@stop_desc", row["stop_desc"]);
                command.Parameters.AddWithValue("@stop_lat", row["stop_lat"]);
                command.Parameters.AddWithValue("@stop_lon", row["stop_lon"]);
                command.Parameters.AddWithValue("@zone_id", row["zone_id"]);
                command.Parameters.AddWithValue("@stop_url", row["stop_url"]);

                command.ExecuteNonQuery();
            }
        }
    }
}

然后,您需要在SaveDataToDatabase方法中添加对Main的调用。我认为这里有足够的代码供您调整以适合您的目的。

答案 1 :(得分:0)

这真的取决于你的情况。这是一个内部文本文件加载到SqlServer 2005或更高版本的数据库(也是内部)?如果是这样,您可以编写一个SSIS包(或者更简单地说,使用SQL Server的“导入数据...”向导),它只会为您阅读。

是否有理由担心未转义的逗号(Say,姓名列的名称格式为Last,First)?然后你需要补偿那个......(这里有很多关于SO的问题解决了这个问题)。

文件不是内部的,也就是说有人上传它并且需要实时读取?然后,SSIS包仍然是您最好的选择,并设置一些代码(现代FTP服务器通常可以调用可执行文件或批处理文件)以在文件到达时启动SSIS包。

这真的是一个非常广泛的问题,没有更多细节,我不确定你将得到的答案有多具体......