テキストファイルの読み込みと書き込み


テキストファイルの内容を読み込み、フォーマットを変更して別のファイルに出力したいです。

下記のコードで全文の読み込みと新しいテキストファイルへの書き込みまではできるようになったのですが、フォーマットを変えるにはどのようなコードを書けばいいのでしょうか？

* * *

**元のテキストファイル**

[code]

    116
    11/2/2012 18:22
    N9 45.483 E10 30.495
    416 m
    117
    11/2/2012 18:22
    N9 45.483 E10 30.495
    415 m
    
[/code]

**書き換え後のテキストファイル**

[code]

    116,11/2/2012 18:22,N9 45.483 E10 30.495,416 m
    117,11/2/2012 18:22,N9 45.483 E10 30.495,415 m
    
[/code]

**ソースコード**

[code]

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.IO;
    
    namespace Reading_textfile
    {
        class Program
        {
            static void Main(string[] args)
            {
                string filePath = @"C:\Users\ryuma\Downloads\Elephantread.txt";
    
                //string[] Lines = File.ReadAllLines(filePath);
    
                List<string> lines = new List<string>();
                lines = File.ReadAllLines(filePath).ToList();
    
                foreach (String line in lines)
                {
                    Console.WriteLine(line);
                }
    
                string filePath2 = @"C:\Users\ryuma\OneDrive\Desktop\WriteFile.txt";
                File.WriteAllLines(filePath2, lines);
                Console.ReadLine();
            }
        }
    }
    
[/code]




単に変換するだけなら、`List<string>`よりも`string[]`を使った方がメソッド呼び出しが減って良さそうです。  
これを：

[code]

    List<string> lines = new List<string>();
    lines = File.ReadAllLines(filePath).ToList();
    
[/code]

こうします：

[code]

    string[] lines = File.ReadAllLines(filePath);
    char[] nl = { '\n' };
    lines = string.Join(",", lines).Replace(" m,", " m\n").Split(nl, StringSplitOptions.RemoveEmptyEntries);
    
[/code]

以下の処理を分割用コードの定義は別にして1行にまとめます。  
(やり方によってはそれも1行に含められるかも)

  * いったん全部の行をカンマで連結
  * 最後の列が空白と`m`で終わることを利用して`m`の直後のカンマを改行コードに変更
  * 改行コードを指定して`string[]`に分割

`StringSplitOptions`が不要ならこちらで変換は1行になりますね。

[code]

    lines = string.Join(",", lines).Replace(" m,", " m\n").Split('\n');
    
[/code]

* * *

**追記**  
その後英語サイトの方に出された質問(+こちらで勝手に追加した想定)の条件に対応してみました。  
[Reading and writing textfile](https://stackoverflow.com/q/59300674/9014308)

  * 英語サイトではデータ間に空白行が存在する可能性が追加されていました。
  * それに関連すれば、データの前後にも空白が付く可能性が考えられます。
  * また英語の回答の中に改行コードの動作中プラットフォーム対応があったので取り入れました。
  * そして書き込む時に行を区切る必要がないので`Split()`は取り止め、書き込みメソッドも変更。

以下のようになります。

[code]

    string line = string.Join(",", lines.Where( // 有効なデータを全てカンマで連結
       s => !string.IsNullOrWhiteSpace(s))      // 事前に空白行ではないものを抽出
          .Select(s => s.Trim()))               // 事前に文字列前後の空白を除去
             .Replace(" m,", " m" + System.Environment.NewLine) // " m"後のカンマを改行へ変換
       + System.Environment.NewLine;            // 最後に改行を付加
    
    string filePath2 = @"C:\Users\ryuma\OneDrive\Desktop\WriteFile.txt";
    File.WriteAllText(filePath2, line); // 分割せず1つの文字列なので WriteAllText
    
[/code]

