#c# #asp.net #asp.net-mvc #asp.net-mvc-3 #csv
#c# #asp.net #asp.net-mvc #asp.net-mvc-3 #csv
Вопрос:
У меня есть файл CSV на удаленном сервере, который доступен по URL, например: http://mydomain.com/test.csv . Это просто записи пары ключ / значение. В моем контроллере, как я мог бы использовать этот файл CSV и перейти к представлению в качестве модели? Я немного новичок в MVC3, поэтому был бы признателен за любую помощь.
Вот пример моего CSV:
key,value
Key1,ValueA
Key2,ValueB
Key3,ValueC
Key4,ValueD
Комментарии:
1. В какой части вам нужна помощь? Загрузить файл? Анализировать CSV? Использовать его в качестве модели?
2. Вы думаете о разборе csv в каждом запросе? Вы могли бы подумать о стратегии кэширования.
Ответ №1:
Я бы не стал вызывать это из контроллера. Я бы делегировал эту логику сервису, используя разработку, основанную на интерфейсе.
Быстрый поиск в Google выдает множество результатов для анализатора CSV. Итак, это просто вопрос построения HTTP-запроса, анализа CSV и последующего сопоставления его с ViewModel.
Итак, ваш контроллер может выглядеть так:
private ICsvParsingService _csvParsingService; // tip: use DI to inject the concrete in ctor.
[HttpGet]
public ActionResult Csv()
{
var csv = _csvParsingService.Parse("http://mydomain.com/test.csv");
var model = Mapper.Map<SomeCsvType,YourModel>(csv); // AutoMapper. Or you could do L-R.
return View(model);
}
Таким образом, если вы решите использовать другой анализатор CSV (или использовать свой собственный), ваш контроллер не нужно менять. И вы можете повторно использовать эту службу в своем приложении.
Ответ №2:
Это кажется таким основным вопросом. Что-то вроде этого должно помочь вам начать.
WebClient client = new WebClient();
string csvContents = client.DownloadString(UrlAsString);
string[] csvLines = csvContents.Split(new string[] {"n", "rn"},
StringSplitOptions.RemoveEmptyEntries);
SomeModel model = new SomeModel()
model.KeyValuePairs = csvLines.Select(x => x.Contains(","))
.Select(x => new KeyValuePair(x.Split(",")[0],
x.Split(",")[1]);
public class SomeModel()
{
public IEnumerable<KeyValuePair> KeyValuePairs { get; set; }
}
public class KeyValuePair()
{
public KeyValuePair() { }
public KeyValuePair(string Key, string Value)
{
this.Key = Key;
this.Value = Value;
}
public string Key { get; set; }
public string Value { get; set; }
}