将CSV文件导入Mongo数据库

时间:2016-07-19 12:46:50

标签: c# mongodb csv import

如果我想从命令行导入CSV文件,我只需使用:

mongoimport -d <database> -c <collection name> --type csv --file <path to csv> --headerline

当然headerline是可选的。就我而言,CSV文件确实有一个标题。

我如何通过C#做同样的事情?是否有类似的一行命令?我知道如何read a CSV file,但我很惊讶我找不到(一个?)简单的命令。

我已经查看了很多online documentation,但其中很多似乎是针对不同的.NET驱动程序版本;我的版本是2.2.4。

到目前为止,这是很长的代码(它有效,但我认为可以更容易地完成):

MongoClient client = new MongoClient("mongodb://127.0.0.1:27017/test"); // local database
var db = client.GetDatabase("test");

var reader = new StreamReader(File.OpenRead(@"<full path to csv")); // where <full path to csv> is the file path, of course
IMongoCollection<BsonDocument> csvFile = db.GetCollection<BsonDocument>("test");

reader.ReadLine(); // to skip header

while (!reader.EndOfStream)
{
    var line = reader.ReadLine();
    var values = line.Split(',');

        BsonDocument row = new BsonDocument
        {
            {"Column0", values[0]},
            {"Column1", values[1]},
            {"Column2", values[2]},
            {"Column3", values[3]}
        };

    csvFile.InsertOne(row);
}

这种格式的一个缺点是我必须有四列 - 我无法保证。

完美的答案将包括skip the header row的方式。

如果相关:我想要导入多个CSV文件,因此我会在目录中找到每个文件 - but I know how to do that

2 个答案:

答案 0 :(得分:1)

我使用CSVHelper进行阅读。 PM控制台-> https://www.nuget.org/packages/CsvHelper/

我已经在3节课中做到了:

  • Program.cs(我在其中阅读实际的.csv并要求创建对象的类)
  • Products.cs(集合详细信息和.csv列必须相同)
  • Mongo.cs(连接到MongoDB并插入或更新文档)

Program.cs:

join

创建的对象列表可以单独放在mongoDB文档中。

Products.cs:

AND t2.StatusName='Closed'

在这里,您需要指定.csv文件的所有行并正确映射它们。索引表示excell中的行(index0 = A,index1 = B ...)

Mongo.cs:

using CsvHelper;
using System;
using System.IO;
using System.Linq;

namespace DataImport
{
    class Program
    {
        static void Main(string[] args)
        {
            // .CSV file path
            Console.WriteLine("Absolute path to .csv file: ");
            string csvFilePath = Console.ReadLine();

            // Reading .csv file line by line and calling for SendingRecord method
            using (var reader = new StreamReader(csvFilePath))
            using (var csv = new CsvReader(reader))
        {
            csv.Configuration.HasHeaderRecord = false; // My file has no header lines, if yours have this must be 'true'
            csv.Configuration.ShouldSkipRecord = record => record.All(string.IsNullOrEmpty); // Skipping empty lines in .CSV file
            var records = csv.GetRecords<Products>().ToList();
            for (int i = 0; i < records.Count; i++)
            {
                Mongo.SendingRecord(records[i]);
            }
        }
    }
}

这是本地主机的连接字符串。为此,您需要至少一个唯一的记录值-id,某种数字等。

如果您有任何疑问,请不要犹豫。只是问问。

答案 1 :(得分:0)

您在cmd上使用该命令?我建议您使用StreamWriter创建一个.bat文件,然后使用Process.Start()执行该.bat文件,并将文件名作为参数传递。

更好的方法:要在命令行上执行,请使用此代码段

string command = ""; //enter any command you want
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C " + command;
process.StartInfo = startInfo;
process.Start();