2015-06-26 4 views
1

У меня много файлов .txt с данными в нем. Данные разделяются ,.Изменить формат даты в файле txt/csv с разделителем

В третьем столбце данные находятся в формате dd-mm-yyyy. Но он должен быть в формате yyyy/mm/dd. Изменение формата машины не является решением.

Файлы достаточно малы для загрузки в память и открываются следующим образом, но я не могу понять, как решить проблему с датой. Кто может мне помочь?

 foreach (string x in a) 
     { 
      string somePath = @"C:\test\"; 
      string filename = x; 
      string path = Path.Combine(somePath, filename); 

      string str = File.ReadAllText(path); 
      str = str.Replace("AS", ""); 
      File.WriteAllText(path, str); 
     } 
+2

Читать линию, линию разделения на '', получить строку даты, разобрать его и заменить на правильный формат, записать строку , повторить до конца? –

+1

[DateTime.TryParseExact] (https://msdn.microsoft.com/en-us/library/ms131044 (v = vs.110) .aspx). Вы также можете взглянуть на [TextFieldParser Class] (https://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser (v = vs.110) .aspx) для разбора CSV-файлов. – Tim

ответ

1

Вот краткий пример использования ReadAllLines() и WriteAllLines():

 string[] lines; 
     string somePath = @"C:\test\"; 
     foreach (string x in a) 
     { 
      string path = Path.Combine(somePath, x); 
      lines = File.ReadAllLines(path); 
      for (int i = 0; i < lines.Length;i++) 
      { 
       lines[i] = lines[i].Replace("AS", ""); 

       string[] values = lines[i].Split(','); 
       if (values.Length >= 3) 
       { 
        string[] parts = values[2].Split('-'); 
        if (parts.Length == 3) 
        { 
         values[2] = String.Format("{0}/{1}/{2}", parts[2], parts[1], parts[0]); 
         lines[i] = String.Join(",", values); 
        } 
       } 
      } 
      File.WriteAllLines(path, lines); 
     } 
+0

Это не относится к требованию OP для изменения формата даты. – Tim

+0

@Tim ...? ... конечно. Он занимает столбец три и разбивает его на тире, а затем возвращает его обратно в желаемом порядке с помощью «/». Впоследствии он помещает линию обратно и обновляет массив «lines». Наконец весь массив написан обратно ... –

+0

Извините, я пропустил это. Но почему бы не использовать 'DateTime.TryParseExact'? – Tim

0

Просто проведите по всем линиям, разделите строку, попробуйте разобрать ее, а затем записать в правильный формат в выходной файл.

foreach (string x in a) 
{ 

    string somePath = @"C:\test\"; 
    string filename = x; 
    string path = Path.Combine(somePath, filename); 

    string str = File.ReadAllText(path); 
    str = str.Replace("AS", ""); 
    var lines = str.Split('\n'); 
    foreach(var line in lines) 
    { 
     var parts = line.Split(','); 
     if(parts.Length > 2) 
     { 
      var d = parts[2]; 
      DateTime dateValue; 
      if (DateTime.TryParseExact(d, "dd-MM-yyyy", new CultureInfo("en-US"), 
       DateTimeStyles.None, out dateValue)) 
       { 
        var dateTxt = dateValue.ToString("yyyy/mm/dd"); 
         ...etc... 

       } 
      } 
     } 
     File.WriteAllText(path, str); 
    } 
+0

Как вы собираетесь поместить 'dateTxt' обратно в правильную позицию в' str', когда используете 'WriteAllText()'? ... –

+0

Это не полное решение, оно должно быть полезно, поскольку вы пишете отдых. –