public void LoadZipCodes(Stream stream) { var csvSettings = new CSVSettings { Encoding = "UTF-8", Separator = '\t', HasHeader = false }; ZipCodes = new MofUriExtent("datenmeister:///zipcodes"); var factory = new MofFactory(); var csvProvider = new CSVDataProvider(null, null); csvProvider.Load( ZipCodes, factory, stream, csvSettings); Columns.ZipCode = csvSettings.Columns[1]; Columns.Name = csvSettings.Columns[4]; Debug.WriteLine($"Loaded: {ZipCodes.elements().Count()} Zipcodes"); }
/// <summary> /// Loads the CSV Extent out of the settings and stores the extent Uri /// </summary> /// <param name="extent">The uri being used for an extent</param> /// <param name="factory">Factory being used to create a new instance</param> /// <param name="path">Path being used to load the extent</param> /// <param name="settings">Settings to load the extent</param> /// <returns>The loaded extent</returns> public void Load(IUriExtent extent, IFactory factory, string path, CSVSettings settings) { using (var fileStream = new FileStream(path, FileMode.Open)) { Load(extent, factory, fileStream, settings); } }
/// <summary> /// Saves the extent into database. /// </summary> /// <param name="extent">Extent to be stored</param> /// <param name="path">Path, where file shall be stored</param> /// <param name="settings">Settings being used</param> public void Save(IUriExtent extent, string path, CSVSettings settings) { var columns = new List<string>(); // Retrieve the column headers if (settings.HasHeader && settings.Columns.Any()) { // Column headers given by old extent columns.AddRange(settings.Columns); } else { // Column headers given by number by asking each object about the number of properties and // then use the maximum value of the elements. This assumes that every element has the same type columns = extent.GetProperties().ToList(); } // Open File using (var streamWriter = new StreamWriter(File.OpenWrite(path), Encoding.GetEncoding(settings.Encoding))) { // Writes the header if (settings.HasHeader) { WriteRow(streamWriter, settings, columns, x => x.ToString()); } // Writes the elements foreach (var element in extent.elements().Select(x => x as IObject)) { WriteRow( streamWriter, settings, columns, x => element.isSet(x) ? element.get(x) : string.Empty); } } }
private static void TestZipCodes() { // Checks the loading of the PLZ System.Console.WriteLine("Loading the Zip codes"); var extent = new MofUriExtent("mof:///plz"); var factory = new MofFactory(); var csvSettings = new CSVSettings { Encoding = "ISO-8859-1", Separator = '\t', HasHeader = false }; var provider = new CSVDataProvider(null, null); provider.Load(extent, factory, "data/plz.csv", csvSettings); System.Console.WriteLine($"Loaded: {extent.elements().Count().ToString()} Zipcodes"); System.Console.WriteLine(); }
/// <summary> /// Loads the CSV Extent out of the settings and stores the extent Uri /// </summary> /// <param name="extent">The uri being used for an extent</param> /// <param name="factory">Factory being used to create a new instance</param> /// <param name="stream">Path being used to load the extent</param> /// <param name="settings">Settings to load the extent</param> /// <returns>The loaded extent</returns> public void Load(IUriExtent extent, IFactory factory, Stream stream, CSVSettings settings) { ReadFromStream(extent, factory, stream, settings); }
/// <summary> /// Writes a columete /// </summary> /// <param name="streamWriter"></param> /// <param name="settings">Settings to be used</param> /// <param name="values"></param> /// <param name="conversion">Converter to be used, to show the content</param> private void WriteRow(StreamWriter streamWriter, CSVSettings settings, IEnumerable<string> values, Func<string, object> conversion) { var builder = new StringBuilder(); var first = true; foreach (var value in values) { if (!first) { builder.Append(settings.Separator); } builder.Append(conversion(value).ToString()); first = false; } streamWriter.WriteLine(builder.ToString()); }
/// <summary> /// Reads the file from the stream /// </summary> /// <param name="path">Path being used to load the file</param> /// <param name="extent">Extet being stored</param> /// <param name="settings">Settings being used to store it.</param> private void ReadFromStream(IExtent extent, IFactory factory, Stream stream, CSVSettings settings) { if (settings == null) { settings = new CSVSettings(); } var columns = settings.Columns; var createColumns = false; using (var streamReader = new StreamReader(stream, Encoding.GetEncoding(settings.Encoding))) { if (columns == null) { createColumns = true; } // Reads header, if necessary if (settings.HasHeader) { columns.Clear(); // Creates the column names for the headline var ignoredLine = streamReader.ReadLine(); var columnNames = SplitLine(ignoredLine, settings); foreach (var columnName in columnNames) { columns.Add(columnName); } } // Reads the data itself string line; while ((line = streamReader.ReadLine()) != null) { var values = SplitLine(line, settings); var csvObject = factory.create(null); // we now have the created object, let's fill it var valueCount = values.Count; for (var n = 0; n < valueCount; n++) { string foundColumn; // Check, if we have enough columns, if we don't have enough columns, create one if (columns.Count <= n && (createColumns || !settings.HasHeader)) { // Create new column foundColumn = $"Column {n + 1}"; columns.Add(foundColumn); } else { foundColumn = columns[n]; } csvObject.set(foundColumn, values[n]); } extent.elements().add(csvObject); } } }
/// <summary> /// Splits a CSV line into columns /// </summary> /// <returns>List of column values</returns> private static IList<string> SplitLine(string line, CSVSettings settings) { return line.Split(new[] {settings.Separator}, StringSplitOptions.None); }