<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>CSV Archivy - blog.vyoralek.cz</title>
	<atom:link href="https://blog.vyoralek.cz/stitek/csv/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.vyoralek.cz/stitek/csv/</link>
	<description>Tech témata, které mě baví</description>
	<lastBuildDate>Sun, 25 Nov 2018 19:51:53 +0000</lastBuildDate>
	<language>cs</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.2</generator>

<image>
	<url>https://i0.wp.com/blog.vyoralek.cz/wp-content/uploads/2019/10/cropped-512px-Circle-icons-pencil_2.svg_.png?fit=32%2C32&#038;ssl=1</url>
	<title>CSV Archivy - blog.vyoralek.cz</title>
	<link>https://blog.vyoralek.cz/stitek/csv/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">133748570</site>	<item>
		<title>ASP.NET Core 2.1 import CSV seed dat</title>
		<link>https://blog.vyoralek.cz/programovani/asp-net-core-2-1-import-csv-seed-dat/</link>
					<comments>https://blog.vyoralek.cz/programovani/asp-net-core-2-1-import-csv-seed-dat/#respond</comments>
		
		<dc:creator><![CDATA[jvyoralek]]></dc:creator>
		<pubDate>Mon, 17 Sep 2018 18:25:08 +0000</pubDate>
				<category><![CDATA[Programování]]></category>
		<category><![CDATA[ASP.NET Core]]></category>
		<category><![CDATA[CSV]]></category>
		<category><![CDATA[import]]></category>
		<category><![CDATA[Seeddata]]></category>
		<guid isPermaLink="false">https://blog.vyoralek.cz/?p=597</guid>

					<description><![CDATA[<p>Jedním se základních kamenů většiny komplexnější webů jsou seed data &#8211; jinými slovy základní číselníky. Dnes se podíváme jak jednoduše taková data dostat přímo do databáze z CSV souborů. Jak na to? V základu máme dvě možnosti: Použijeme jednoduchý způsob čtení CSV souborů a postupného procházení řádků a &#8222;ručního&#8220; parsování atributů do objektů Použijeme poněkud [&#8230;]</p>
<p>The post <a href="https://blog.vyoralek.cz/programovani/asp-net-core-2-1-import-csv-seed-dat/">ASP.NET Core 2.1 import CSV seed dat</a> appeared first on <a href="https://blog.vyoralek.cz">blog.vyoralek.cz</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Jedním se základních kamenů většiny komplexnější webů jsou seed data &#8211; jinými slovy základní číselníky. Dnes se podíváme jak jednoduše taková data dostat přímo do databáze z CSV souborů.</p>



<h2 class="wp-block-heading">Jak <g class="gr_ gr_13 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling" id="13" data-gr-id="13">na</g> to?</h2>



<p>V základu máme dvě možnosti:</p>



<ol><li>Použijeme jednoduchý způsob čtení CSV souborů a postupného procházení řádků a &#8222;ručního&#8220; parsování atributů do objektů</li><li>Použijeme poněkud chytřejší postup, kdy budeme chtít aby na základě hlavičky se jednotlivé řádky samy naparsovaly na jednotlivé atributy objektů &#8211;<span style="text-decoration: underline;"> tomuto způsobu se budeme věnovat dále.</span></li></ol>



<h2 class="wp-block-heading">Komponenta pro mapování</h2>



<p>Existuje hned několik komponent, které poskytují pro .NET možnost mapování CSV sloupců na atributy objektů. My se však podíváme na použití jedné konkrétní a to <a href="https://www.filehelpers.net/">FileHelperu</a> ve verzi 3.3</p>



<div class="wp-block-image"><figure class="aligncenter is-resized"><img fetchpriority="high" decoding="async" src="https://i0.wp.com/www.filehelpers.net/images/use_case1.jpg?resize=484%2C243&#038;ssl=1" alt="general read write of filehelpers" width="484" height="243" data-recalc-dims="1" /></figure></div>



<h2 class="wp-block-heading">Úprava <g class="gr_ gr_11 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling ins-del multiReplace" id="11" data-gr-id="11">definice</g> třídy</h2>



<p>Samotná definice datového objektu může být krapet komplikovanější, než data která chceme z CSV nahrát. Naštěstí však máme poměrně velké množství <a href="https://www.filehelpers.net/mustread/">atributů</a>, které můžeme buďto celé třídě a nebo jednotlivým vlastnostem přiřadit.</p>



<p>Jedním s nejdůležitějším je pak atribut [FieldHidden], který nám říká, že pro import z CSV bude tento prvek ignorován.</p>



<p>Dále se mi hodilo:</p>



<ul><li>FieldOptional &#8211; určuje nepovinný prvek</li><li>FieldConverter &#8211; lze definovat specifickou konverzi hodnoty z CSV do třídy</li></ul>



<pre class="wp-block-code"><code> [DelimitedRecord(";"), IgnoreFirst]
 [Table("City")]
 public class City
 {
     [Key]        
     public int Id { get; set; }
        
     [Required]
     [StringLength(255)]        
     public string Name { get; set; }

     [FieldOptional]
     [FieldConverter(typeof(EmptyStringConverter))]
     public string CountryCode { get; set; }
     [FieldHidden]
     public Country Country { get; set; }

     [FieldHidden]
     public virtual ICollection&lt;Place> Places { get; set; }
}</code></pre>



<h2 class="wp-block-heading"><g class="gr_ gr_5 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling ins-del multiReplace" id="5" data-gr-id="5">Definice</g> <g class="gr_ gr_12 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling ins-del multiReplace" id="12" data-gr-id="12">importu</g>&nbsp;Seed <g class="gr_ gr_60 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling ins-del multiReplace" id="60" data-gr-id="60">dat</g> v DbContextu</h2>



<p>Jelikož ASP.NET Core od verze 2.1 přidává určitou podporu nahrávání Seed data bude definice velice jednoduchá.</p>



<p>Otevřeme si pouze definici našeho DbContextu a v metodě OnModelCreating přidáme tři řádky:</p>



<pre class="wp-block-code"><code>var engineCity = new FileHelperEngine&lt;City>();
var recordsCity = engineCity.ReadFile(@"Data\City.csv");
builder.Entity&lt;City>().HasData(recordsCity);</code></pre>



<p>Jak můžeme vidět pouze definuje s kterou datovou třídou budeme pracovat, z jakého souboru se data mají načíst a konečně kam se mají uložit.</p>



<h2 class="wp-block-heading">Import seed data</h2>



<p>K samotnému importu data pak dojde až pomocí migrace a její aplikace na databázi.</p>



<p>Do migračního skriptu se nám přidá něco v tomto stylu:</p>



<pre class="wp-block-code"><code>   migrationBuilder.InsertData(
                table: "City",
                columns: new[] { "Id", "CountryCode", "Name" },
                values: new object[,]
                {
                    { 1, "ARM", "Goris" },
                    { 46, "PHL", "Parañaque" },
                    { 45, "PHL", "Palawan" },
                    { 44, "PHL", "Malay" },
....</code></pre>
<p>The post <a href="https://blog.vyoralek.cz/programovani/asp-net-core-2-1-import-csv-seed-dat/">ASP.NET Core 2.1 import CSV seed dat</a> appeared first on <a href="https://blog.vyoralek.cz">blog.vyoralek.cz</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.vyoralek.cz/programovani/asp-net-core-2-1-import-csv-seed-dat/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">597</post-id>	</item>
	</channel>
</rss>
