From 48c8cc3ac2abc113c55ae80e76d034ee54ef82b1 Mon Sep 17 00:00:00 2001 From: Dimitar Byalkov Date: Thu, 8 Jul 2021 10:59:18 +0300 Subject: [PATCH] Writer, Reader, Quote fix and formatting --- .../Controller/RecordController.cs | 16 ++--- .../BoerseDataConvert/Views/Program.cs | 57 ++++++++++++------ .../BoerseDataConvert/Views/Reader.cs | 10 ++- .../BoerseDataConvert/Views/Writer.cs | 13 ++-- .../BoerseDataConvert/Views/ZipHandler.cs | 12 ---- BoerseDataConvert/Документация.docx | Bin 21719 -> 21730 bytes 6 files changed, 61 insertions(+), 47 deletions(-) delete mode 100644 BoerseDataConvert/BoerseDataConvert/Views/ZipHandler.cs diff --git a/BoerseDataConvert/BoerseDataConvert/Controller/RecordController.cs b/BoerseDataConvert/BoerseDataConvert/Controller/RecordController.cs index da44107..58a382e 100644 --- a/BoerseDataConvert/BoerseDataConvert/Controller/RecordController.cs +++ b/BoerseDataConvert/BoerseDataConvert/Controller/RecordController.cs @@ -9,7 +9,7 @@ namespace BoerseDataConvert { public class RecordController { - private static int count; + private static int count; private static string cur_fileName; public RecordController(string fileName) @@ -30,7 +30,7 @@ namespace BoerseDataConvert { try { - string tag =CheckTagValue(tagValue.Key, tagValue.Value); + string tag = CheckTagValue(tagValue.Key, tagValue.Value); xmlRecord.Append($" <{tag}>{tagValue.Value}\n"); } catch (ArgumentException e) @@ -44,11 +44,11 @@ namespace BoerseDataConvert } private string CheckTagValue(string tag, string value) { - string tagname=""; + string tagname = ""; StreamReader reader = new StreamReader(@"..\..\..\..\tags.txt"); using (reader) { - string[] tagLine= null ; + string[] tagLine = null; while (!reader.EndOfStream) { string[] line = reader.ReadLine().Split('|').ToArray(); @@ -76,7 +76,7 @@ namespace BoerseDataConvert } } - else + else { string[] valueRange = tagLine[3].Split('#').ToArray(); bool countain = false; @@ -87,10 +87,10 @@ namespace BoerseDataConvert { countain = true; break; - } + } } - if(!countain) throw new ArgumentException("Value is not in value range!"); - } + if (!countain) throw new ArgumentException("Value is not in value range!"); + } } return tagname; } diff --git a/BoerseDataConvert/BoerseDataConvert/Views/Program.cs b/BoerseDataConvert/BoerseDataConvert/Views/Program.cs index 5a78b5b..d4733b6 100644 --- a/BoerseDataConvert/BoerseDataConvert/Views/Program.cs +++ b/BoerseDataConvert/BoerseDataConvert/Views/Program.cs @@ -15,29 +15,47 @@ namespace BoerseDataConvert // -d directory or --dir directory // -o directory or --output direcory // -h - help - // Console.OutputEncoding = System.Text.Encoding.UTF8; + + // input handling + string zipFile = "", inputDir = "", outputDir = ""; Console.WriteLine(); if (args.Contains("-i") || args.Contains("--input")) { - string zipfile = args[Array.IndexOf(args, "-i") + 1]; + zipFile = args[Array.IndexOf(args, "-i") + 1]; } if (args.Contains("-d") || args.Contains("--directory")) { - string inputDir = args[Array.IndexOf(args, "-d" + 1)]; + inputDir = args[Array.IndexOf(args, "-d") + 1]; } if (args.Contains("-o") || args.Contains("--output")) { - string outputDir = args[Array.IndexOf(args, "-o" + 1)]; + outputDir = args[Array.IndexOf(args, "-o") + 1]; } if (args.Contains("-h") || args.Contains("--help")) { Help(); return; } - Reader reader = new Reader(@"E:\Downloads\TestData-2021_07_02", new string[1] { "subtype910.txt" }); - // Reader reader = new Reader(@"D:\Code\ИТ Кариера\Стаж\задача\TestData-2021_07_02", new string[1] { "subtype910.txt" }); - RecordController a = new RecordController("subtype910.txt"); - Writer writer = new Writer("subtype910.txt"); + zipFile = @"D:\Code\ИТ Кариера\Стаж\задача\testdata.zip"; + inputDir = @"D:\Code\ИТ Кариера\Стаж\задача\TestData"; + outputDir = @"D:\Code\ИТ Кариера\Стаж\задача\outputdir"; + if (zipFile == "" || inputDir == "" || outputDir == "") + { + throw new ArgumentException("Fields cannot be empty"); + } + + // TODO: clear matching files from inputDir + // TODO: check free disk space before file ops + + ZipFile.ExtractToDirectory(zipFile, inputDir); // zip extract + + // read files + string[] fileNames = Directory.GetFiles(inputDir).Select(x => x.Split('\\', '/').Last()).ToArray(); + + Reader reader = new Reader(inputDir, fileNames); + Writer writer = new Writer(outputDir, fileNames[0]); + RecordController a = new RecordController(fileNames[0]); + while (true) { try @@ -48,20 +66,21 @@ namespace BoerseDataConvert } catch (IndexOutOfRangeException e) { + Reader.EndFile(); Writer.EndFile(); break; } - + } + static void Help() + { + Console.WriteLine("BoerseDataConvert v1.0.0"); + Console.WriteLine("D. Delchev and D. Byalkov, 2021"); + Console.WriteLine("---"); + Console.WriteLine("-i or --input "); + Console.WriteLine("-d or --directory "); + Console.WriteLine("-o or --output "); + Console.WriteLine("-h or --help - Prints this message"); } } - static void Help() - { - Console.WriteLine("BoerseDataConvert v1.0.0"); - Console.WriteLine("D. Delchev and D. Byalkov, 2021"); - Console.WriteLine("---"); - Console.WriteLine("-i or --input "); - Console.WriteLine("-d or --directory "); - Console.WriteLine("-o or --output "); - } } -} +} \ No newline at end of file diff --git a/BoerseDataConvert/BoerseDataConvert/Views/Reader.cs b/BoerseDataConvert/BoerseDataConvert/Views/Reader.cs index 6ff63d3..ee97a50 100644 --- a/BoerseDataConvert/BoerseDataConvert/Views/Reader.cs +++ b/BoerseDataConvert/BoerseDataConvert/Views/Reader.cs @@ -10,7 +10,7 @@ namespace BoerseDataConvert public class Reader { private string[] filesNames; - private StreamReader reader; + private static StreamReader reader; private int fileInd; private string adr; public Reader(string adr, string[] filesNames) @@ -27,14 +27,14 @@ namespace BoerseDataConvert if (s.Substring(0, 11) == "Datensaetze") { fileInd++; - reader.Close(); + EndFile(); reader = new StreamReader($@"{adr}/{filesNames[fileInd]}", CodePagesEncodingProvider.Instance.GetEncoding(1252)); RecordController.NextFile(filesNames[fileInd]); Writer.NextFile(filesNames[fileInd]); s = reader.ReadLine(); s = reader.ReadLine(); } - string[] sr = s.Split("|").ToArray(); + string[] sr = s.Split("|").ToArray(); Dictionary a = new Dictionary(); foreach (var item in sr) { @@ -45,5 +45,9 @@ namespace BoerseDataConvert record.TagsValues = a; return record; } + internal static void EndFile() + { + reader.Close(); + } } } diff --git a/BoerseDataConvert/BoerseDataConvert/Views/Writer.cs b/BoerseDataConvert/BoerseDataConvert/Views/Writer.cs index f9cd52f..e35737f 100644 --- a/BoerseDataConvert/BoerseDataConvert/Views/Writer.cs +++ b/BoerseDataConvert/BoerseDataConvert/Views/Writer.cs @@ -11,13 +11,16 @@ namespace BoerseDataConvert { private static string curFilesName; private static StreamWriter writer; + private static string address; - public Writer(string filesName) + public Writer(string _address, string filesName) { + address = _address; curFilesName = filesName; string[] file = curFilesName.Split('.').ToArray(); - writer = new StreamWriter($"{file[0]}.xml"); - writer.WriteLine($""); + writer = new StreamWriter($@"{address}/{file[0]}.xml"); + writer.WriteLine($"
"); + } public void WriteRecord(string record) { @@ -28,8 +31,8 @@ namespace BoerseDataConvert EndFile(); curFilesName = fileName; string[] file = curFilesName.Split('.').ToArray(); - writer = new StreamWriter($"{file[0]}.xml"); - writer.WriteLine($"
"); + writer = new StreamWriter($@"{address}/{file[0]}.xml"); + writer.WriteLine($"
"); } public static void EndFile() { diff --git a/BoerseDataConvert/BoerseDataConvert/Views/ZipHandler.cs b/BoerseDataConvert/BoerseDataConvert/Views/ZipHandler.cs deleted file mode 100644 index 3ddf1d9..0000000 --- a/BoerseDataConvert/BoerseDataConvert/Views/ZipHandler.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace BoerseDataConvert -{ - class ZipHandler - { - } -} diff --git a/BoerseDataConvert/Документация.docx b/BoerseDataConvert/Документация.docx index 6834e1f080b92abd27cf5c548783784e9fcf6958..00ca68707f01c25267ddbd53578b479aa645c8fe 100644 GIT binary patch delta 8696 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