| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

C Sharp サンプルコード

提供: MyMemoWiki
2021年11月29日 (月) 10:34時点におけるPiroto (トーク | 投稿記録)による版 (→‎エンコーディングを指定してファイルを読む)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

C# サンプルコード

C Sharp | 言語まとめ C Sharp |

ファイル

ファイル名を抽出

var filename = Path.GetFileName(file);

ファイルを書く

using (var writer = new StreamWriter(Path.Combine(outPath, "Hoge.csv")))
{
    writer.WriteLine("Something to write.");
}

エンコーディングを指定してファイルを読む

 using System;
 using System.IO;
 namespace ConsoleApplication1
 {
      class Program
     {
         static void Main(string[] args)
         {
             string path = @"c:\work\test.csv";
             using (var reader = new StreamReader(path, System.Text.Encoding.GetEncoding("shift_jis")))
             {
                 string line = null;
                 while ((line = reader.ReadLine()) != null)
                 {
                     Console.WriteLine(line);
                 }
             }
         }
     }
 }
  • 以下のようなエラーが出る場合
System.ArgumentException: ''Shift_JIS' is not a supported encoding name. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method. '

 

using System.Text;
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

CSVファイルを解析(TextFieldParser)

  • http://msdn.microsoft.com/ja-jp/library/x710fk43.aspx
  • 便利だが、どんな挙動をするのかよくわからない(どこにドキュメントがあるの?)
    • 二重引用符で囲まれたフィールドでは、カンマはセパレータとしてではなく、値として判定してくれる(Excel仕様?)
    • なぜVisualBasic名前空間にある?
using System;
using Microsoft.VisualBasic.FileIO; 

namespace ConsoleApplication1
{
     class Program
    {
        static void Main(string[] args)
        {
            string path = @"c:\work\test.csv";
            using (TextFieldParser parser = new TextFieldParser(path,System.Text.Encoding.GetEncoding("shift_jis")))
            {
                parser.TextFieldType = FieldType.Delimited;
                parser.SetDelimiters(",");
                try
                {
                    while (!parser.EndOfData)
                    {
                        string[] fields = parser.ReadFields();
                        foreach (string field in fields)
                        {
                            Console.Write("[{0}]", field);
                        }
                        Console.WriteLine();
                    }
                }
                catch (MalformedLineException e)
                {
                    Console.WriteLine(e);
                    System.Environment.Exit(1);
                }
            }
        }
    }
}

UTF-8 エンコード BOMありなし

  • UTF-8をGetEncodeすると、BOMが付く。new System.Text.UTF8Encoding(false) でBOMなし
Encoding enc = null;
if(String.Equals(toEnc,"utf-8", StringComparison.OrdinalIgnoreCase)) {
    // BOMなし
    enc = new System.Text.UTF8Encoding(false);
}
else
{
    enc = Encoding.GetEncoding(toEnc);
}

ファイルエンコード一括変換

public class FileEncodingConverter
{
    public FileEncodingConverter() {
        System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
    }

    /// <summary>
    /// 指定されたディレクトリのすべてのファイルのエンコードを変換して別のディレクトリに書き出す
    /// </summary>
    /// <param name="srcDir">変換元ディレクトリ</param>
    /// <param name="dstDir">変換先ディレクトリ</param>
    /// <param name="fromEnc">変換元エンコーディング</param>
    /// <param name="toEnc">変換後エンコーディング</param>
    public void convertDir(string srcDir, string dstDir, string fromEnc, string toEnc)
    {
        if (!Directory.Exists(dstDir))
        {
            Directory.CreateDirectory(dstDir);
        }

        var files = Directory.GetFiles(srcDir);
        foreach(var file in files)
        {
            var filename = Path.GetFileName(file);
            convert(file, Path.Combine(dstDir, filename), fromEnc, toEnc);
        }
    }

    /// <summary>
    /// 指定されたファイルのエンコードを変換して別ファイルに書き出す
    /// </summary>
    /// <param name="srcFile">変換元ファイル</param>
    /// <param name="dstFile">変換後ファイル</param>
    /// <param name="fromEnc">変換元エンコーディング</param>
    /// <param name="toEnc">変換後エンコーディング</param>
    public void convert(string srcFile, string dstFile, string fromEnc, string toEnc)
    {
        using(var writer = new StreamWriter(File.OpenWrite(dstFile),Encoding.GetEncoding(toEnc)))
        {
            foreach(var line in File.ReadLines(srcFile, System.Text.Encoding.GetEncoding(fromEnc)))
            {
                writer.WriteLine(line);
            }
         }
    }
}

設定

C# 設定情報を保存する

LINQ

C# LINQ使用例

非同期処理

C# 非同期処理からUIスレッドにアクセスし画面を更新する

C# asyncとawaitの動作確認

WPF