2017-08-23 6 views
0

これは私の初めての投稿です。そのため、無知や例の使用に失敗したことをお詫び申し上げます。XMLに区切られたCSV - フォルダ階層

私はかなり少数のCSVファイルが与えられている場所を作成するためのコンソールアプリプロジェクトがありますが、親子関係のいくつかを作成する必要があります(XML?多分?アップロードを行うと、最小限の呼び出しでDMSに書き込みをするために - フォルダが何度も存在している場合、私はクエリを実行することにしたくない)

を、私は私が必要とするこの1

に少し私の深さの外にしていますサードパーティライブラリの依存関係がなくてもこれを行う最善の方法を知るためには、OLEDB JETプロバイダを使用する純粋なC#が必要な解析を処理するために必要な可能性が高く、これまでのところCSVファイルには順序がありません。ダウに見えるnリストとその逆。

年と月 - ここ

は、エンド出力は、(これらは最終的にDMS内部の列を更新するためのものである)YEAR/MONTH/FILENAME +(各ファイルの属性)になりますCSV出力

"DESCRIPTION1","8, 5/8\" X 6.4MM","STRING","filename001.pdf","2016-09-19","1" 
"DESCRIPTION2","12, 3/4\" X 6.4MM","STRING","filename001.pdf","2016-09-19","1" 
"DESCRIPTION3","12, 3/4\" X 6.4MM","STRING","filename001.pdf","2016-09-19","1" 
"another description 20# gw","1","388015","Scan123.pdf","2015-10-24","1" 
"another description 20# gw","3","385902","Scan456.pdf","2015-04-14","1" 
"STRINGVAL1","273.10 X 9.27 X 6000","45032-01","KHJDWNEJWKFD9101529.pdf","2012-02-03","1" 
"STRINGVAL2","273.10 X 21.44 X 6000","7-09372","DJSWH68767681540.pdf","2017-02-03","1" 

の例です

YEAR alreadが存在する場合、それは再び作成されません
その年の月が存在する場合、それは作成されませんain
ファイル名がすでにYEAR/MONTHに存在する場合、ファイル名は再度作成されませんが、そのFileNameの追加の属性が属性に追加されます(「行区切り?」)。

必要な出力:私は私が進行するが、それはすべての行を出力し、何のグループ化を行わないために出力することができる、必要なXMLを開始するためにLINQクエリを試みた

enter image description here

、私はLINQのに慣れていないです現時点では。

私はこのようにしている.Split( '、')の基本エスケープに関する問題もありました(私のテストファイルと以下の例でTAB分離を使用した私と比較して、元のCSVの例を参照してください)。 Oledbのプロバイダがそれを処理してもらいたい。

string[] source = File.ReadAllLines(@"C:\Processing\In\mockCsv.csv"); 
XElement item = new XElement("Root", 
    from str in source 
    let fields = str.Split('\t') 
    select new XElement("Year", fields[4].Substring(0, 4), 
    new XElement("Month", fields[4].Substring(5, 2), 
     new XElement("FileName", fields[3]), 
     new XElement("Description",fields[0]), 
     new XElement("Length", fields[1]), 
     new XElement("Type", fields[2]), 
     new XElement("FileName", fields[3]), 
     new XElement("Date", fields[4]), 
     new XElement("Authorised", fields[5])) 
     )     
); 

はまた、私は設定してください、次のように

Logger.Write(String.Format("Reading records from csv file ({0})... ", 
      csvFile), Logger.MsgType.Info, true, false); 
+0

あなたの問題は何かわかりません。 CSVを解析することはできませんか?または、メモリ内のオブジェクトからXMLを作成する方法がわからないのですか?より具体的にするために質問を更新してください。 –

+0

私はcsvからオブジェクトをグループ化し、グループ化された属性を持つ必要な別の形式でXMLに出力する方法がわかりません – RJones

+0

.Netの 'TextFieldParser'を使用してください。とにかく、あなたは1つの質問であまりにも多くを求めています。 –

答えて

1

として使用されるLoggerクラス

private class Logger 
{ 
    private static string LogFile = null; 

    internal enum MsgType 
    { 
     Info, 
     Debug, 
     Error 
    } 

    static Logger() 
    { 
     var processingDetails = ConfigurationManager.GetSection(SECTION_PROCESSINGDETAILS) as NameValueCollection; 
     LogFile = Path.Combine(processingDetails[KEY_WORKINGFOLDER], 
           String.Format("Log_{0}.txt", StartTime.ToString("MMMyyyy"))); 
     if (File.Exists(LogFile)) 
      File.Delete(LogFile); 
    } 

    internal static void Write(string msg, MsgType msgType, bool isNewLine, bool closeLine) 
    { 
     if (isNewLine) 
      msg = String.Format("{0} - {1} : {2}", DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss"), msgType, msg); 

     if (closeLine) 
      Console.WriteLine(msg); 
     else 
      Console.Write(msg); 

     if (String.IsNullOrEmpty(LogFile)) 
      return; 

     try 
     { 
      using (StreamWriter sw = new StreamWriter(LogFile, true)) 
      { 
       if (closeLine) 
        sw.WriteLine(msg); 
       else 
        sw.Write(msg); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 
} 

持っているので、プロセスの各ステップを記録する必要があります。ファイルから読み込む場合は、StringReaderの代わりにStreamReaderを使用してください。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 
using System.IO; 
using System.Text.RegularExpressions; 


namespace ConsoleApplication74 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      string input = 
         "\"DESCRIPTION1\",\"8, 5/8 X 6.4MM\",\"STRING\",\"filename001.pdf\",\"2016-09-19\",\"1\"\n" + 
         "\"DESCRIPTION2\",\"12, 3/4 X 6.4MM\",\"STRING\",\"filename001.pdf\",\"2016-09-19\",\"1\"\n" + 
         "\"DESCRIPTION3\",\"12, 3/4 X 6.4MM\",\"STRING\",\"filename001.pdf\",\"2016-09-19\",\"1\"\n" + 
         "\"another description 20# gw\",\"1\",\"388015\",\"Scan123.pdf\",\"2015-10-24\",\"1\"\n" + 
         "\"another description 20# gw\",\"3\",\"385902\",\"Scan456.pdf\",\"2015-04-14\",\"1\"\n" + 
         "\"STRINGVAL1\",\"273.10 X 9.27 X 6000\",\"45032-01\",\"KHJDWNEJWKFD9101529.pdf\",\"2012-02-03\",\"1\"\n" + 
         "\"STRINGVAL2\",\"273.10 X 21.44 X 6000\",\"7-09372\",\"DJSWH68767681540.pdf\",\"2017-02-03\",\"1\"\n"; 

      string pattern = "\\\"\\s*,\\s*\\\""; 

      string inputline = ""; 
      StringReader reader = new StringReader(input); 

      XElement root = new XElement("Root"); 
      while ((inputline = reader.ReadLine()) != null) 
      { 
       string[] splitLine = Regex.Split(inputline,pattern); 
       Item newItem = new Item() { 
        description = splitLine[0].Replace("\"",""), 
        length = splitLine[1], 
        type = splitLine[2], 
        filename = splitLine[3], 
        date = DateTime.Parse(splitLine[4]), 
        authorized = splitLine[5].Replace("\"", "") == "1" ? true : false 
       }; 

       Item.items.Add(newItem); 
      } 

      foreach(var year in Item.items.GroupBy(x => x.date.Year).OrderBy(x => x.Key)) 
      { 
       XElement newYear = new XElement("_" + year.Key.ToString()); 
       root.Add(newYear); 
       foreach(var month in year.GroupBy(x => x.date.Month).OrderBy(x => x.Key)) 
       { 
        XElement newMonth = new XElement("_" + month.Key.ToString()); 
        newYear.Add(newMonth); 

        newMonth.Add(
         month.OrderBy(x => x.date).Select(x => new XElement(
          x.filename, 
          string.Join("\r\n", new object[] { 
           x.description, 
           x.length, 
           x.type, 
           x.date.ToString(), 
           x.authorized.ToString() 
          }).ToList() 
        ))); 
       } 
      } 
     } 

    } 
    public class Item 
    { 
     public static List<Item> items = new List<Item>(); 

     public string description { get; set; } 
     public string length { get; set; } 
     public string type { get; set; } 
     public string filename { get; set; } 
     public DateTime date { get; set; } 
     public Boolean authorized { get; set; } 
    } 
} 
+0

ありがとう、これはかなり遅い今、私はそれを実行し、出力を見て、私は私に働く何かを与えるためにそれを少し操作することができると思う、あなたの時間をありがとう(私はあなたにアップを与えた私の新しいステータスのために、それは記録されているが、ページには表示されていないと言われています) – RJones

+0

もしそうなら、答えとして必ずマークを付けてください。 – Daniel

+0

回答済み - XML構造を出力するために少し操作することができました。 – RJones

関連する問題