如果我想从命令行导入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。
答案 0 :(得分:1)
我使用CSVHelper进行阅读。 PM控制台-> https://www.nuget.org/packages/CsvHelper/
我已经在3节课中做到了:
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();