在c# /Core MVC中上传和解析csv文件



我有以下代码,我试图用它来解析正在上传的CSV文件:

private Dictionary<string, string[]> LoadData(IFormFile file) 
{
// Verify that the user selected a file
if (file != null && file.Length > 0) 
{
string wwwPath = this.environment.WebRootPath;
// string contentPath = this.environment.ContentRootPath;
string path = Path.Combine(wwwPath, "WeeklySchedules");
if (!Directory.Exists(path)) 
{
Directory.CreateDirectory(path);
}
string fileName = Path.GetFileName(file.FileName);
using (FileStream stream = new FileStream(Path.Combine(path, fileName), FileMode.Create)) 
{
file.CopyTo(stream);
// System.Threading.Thread.Sleep(1000);
using (TextFieldParser parser = new TextFieldParser(Path.Combine(path, fileName))) 
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
Dictionary<string, string[]> parsedData = new Dictionary<string, string[]>();
while (!parser.EndOfData) 
{
// Process row
string[] fields = parser.ReadFields();
int count = 0;
if (count++ == 0) 
{
continue;
}
var pickup = fields[0]; 
var pickupDate = fields[1];
var dropoff = fields[2];
var dropoffDate = fields[3];
var driver = fields[7];
var pickupTime = DateTime.Parse(pickupDate).ToLongTimeString();
// string[] data = 
}
}
}
}
return null;
}

您会注意到,我将上传流的路径传递给解析器,而不是流本身。我试着在小溪里通过,但也不行。当我在wwwroot/WeeklySchedules中检查时,文件就在那里。但是当解析器到达它时,它返回为空。我甚至还调用了一个Sleep()来检查我是否过早地点击了文件。但这并没有什么区别。

我在原始流中得到一些奇怪的错误,但文件被写入,这让我感到困惑。

错误如下:

流。ReadTimeout = '流'。ReadTimeout抛出了一个类型为System的异常。InvalidOperationException '

流。WriteTimeout = 'stream. 'WriteTimeout抛出了一个类型为System的异常。InvalidOperationException '

我已经阅读了一堆关于加载/解析CSV文件技术的博客文章和SO问题,但没有一个表明这是一个问题。

有人有什么想法吗?

您的第一个文件流在第一次使用时仍然打开,您尝试使用TextFieldParser再次读取它

private Dictionary<string, string[]> LoadData(IFormFile file)
{
// Verify that the user selected a file
if (file != null && file.Length > 0)
{
string wwwPath = this.environment.WebRootPath;
// string contentPath = this.environment.ContentRootPath;
string path = Path.Combine(wwwPath, "WeeklySchedules");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
string fileName = Path.GetFileName(file.FileName);
using (FileStream stream = new FileStream(Path.Combine(path, fileName), FileMode.Create))
{
file.CopyTo(stream);
}
// System.Threading.Thread.Sleep(1000);
using (TextFieldParser parser = new TextFieldParser(Path.Combine(path, fileName)))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
Dictionary<string, string[]> parsedData = new Dictionary<string, string[]>();
while (!parser.EndOfData)
{
// Process row
string[] fields = parser.ReadFields();
int count = 0;
if (count++ == 0)
{
continue;
}
var pickup = fields[0];
var pickupDate = fields[1];
var dropoff = fields[2];
var dropoffDate = fields[3];
var driver = fields[7];
var pickupTime = DateTime.Parse(pickupDate).ToLongTimeString();
// string[] data = 
}
}
}
return null;
}

通过文件保存代码;在解析器开始读取文件之前,解开2个using语句的缠结,以确保文件已完全写入并已正确关闭。

using (FileStream stream = new FileStream(Path.Combine(path, fileName), FileMode.Create)) 
{
file.CopyTo(stream);
}

using (TextFieldParser parser = new TextFieldParser(Path.Combine(path, fileName))) 
{
// ..
}

相关内容

  • 没有找到相关文章

最新更新