Создать XML из нескольких CSV в нескольких папках

1

Весь смысл в том, что я делаю: мне нужно создать главный XML из нескольких CSV файлов, расположенных в нескольких подпапках в одной основной папке.

Это то, что я использую прямо сейчас, но, похоже, переписывает и создает xml только для последнего CSV...

String AudioDir = @"C:\XMLFILES";
        DirectoryInfo AudiodirInfo = new DirectoryInfo(AudioDir);
        if (AudiodirInfo.Exists == false)
        {
            Directory.CreateDirectory(AudioDir);
        }

        List<String> AudioXMLFiles = Directory.GetFiles(@"C:\LOGGER AUDIO", "*.csv*", SearchOption.AllDirectories).ToList();
        XElement audxml = null;
        foreach (string file in AudioXMLFiles)
        {
            string[] lines2 = File.ReadAllLines(file);
           audxml = new XElement("root",
           from str in lines2
           let columns = str.Split(',')
           select new XElement("recording_info",
                   new XElement("recorded_accound_id", columns[1]),
                   new XElement("date_created_ts", String.Format("{0:####-##-##  ##:##:##}", Convert.ToInt64(columns[2] + columns[3]))),                                    
                   new XElement("recorded_cid", columns[9]),//1
                   new XElement("recording_tag", columns[1]),
                   new XElement("filename", columns[1] + "_" + columns[2] + "_" + columns[3]),
                   new XElement("record", columns[3]),//Record in TimeoutException format
                   new XElement("from_caller_id", columns[10] + "  <" + columns[8] + ">")



               ));


        }
        audxml.Save(@"C:\XMLFile.xml");
Теги:
csv
xelement

2 ответа

2
Лучший ответ

Вы переписываете audxml на каждой итерации foreach. Вероятно, вы хотите создать корневой узел за пределами цикла, а затем добавить каждый файл xml-выход в этот корневой узел.

XElement audxml = new XElement("root");

foreach (string file in AudioXMLFiles)
    {
        string[] lines2 = File.ReadAllLines(file);
       XElement filexml = new XElement("root",
       from str in lines2
       let columns = str.Split(',')
       select new XElement("recording_info",
               new XElement("recorded_accound_id", columns[1]),
               new XElement("date_created_ts", String.Format("{0:####-##-##  ##:##:##}", Convert.ToInt64(columns[2] + columns[3]))),                                    
               new XElement("recorded_cid", columns[9]),//1
               new XElement("recording_tag", columns[1]),
               new XElement("filename", columns[1] + "_" + columns[2] + "_" + columns[3]),
               new XElement("record", columns[3]),//Record in TimeoutException format
               new XElement("from_caller_id", columns[10] + "  <" + columns[8] + ">")
           ));

           audXml.Add(fileXml);
    }
    audxml.Save(@"C:\XMLFile.xml");
  • 0
    Что-то так просто .. Спасибо ..
0

Проблема в том, что вы воссоздаете документ на каждой итерации цикла foreach.

Вместо этого вы должны создать корневой документ перед циклом. Затем вы добавляете элементы к корню внутри цикла.

Пример:

XElement audxml = new XElement("root");
foreach(...)
{
  //..
  audxml.Add(new XElement("blabla"));
}

Это сохранит данные в XElement для каждой итерации и просто добавит к существующему корневому элементу.

//Майк

Ещё вопросы

Сообщество Overcoder
Наверх
Меню