DBFの文字コード変換


Shape Fileの属性部分である
使用ライブラリやソフトによってはDBFの文字コードが異なり文字化けしたりする。

変換するには、dotnetdbfとかが使える。
https://github.com/ekonbenefits/dotnetdbf

nuget

Install-Package dotnetdbf

下記のようなコンソールアプリを作りshift-jis , utf-8などで変換できる。

using DotNetDBF;
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
if (args.Length != 3)
  {
    Console.WriteLine("引数1 DBFファイル 引数2 DBFのエンコード 引数3 変換したいエンコード");
    return;
  }

  string srcPath = args[0];//@"C:\Data\TEST.dbf";

  Encoding srcEnc = null;
  Encoding dstEnc = null;
  try
  {
    srcEnc = Encoding.GetEncoding(args[1]);
    dstEnc = Encoding.GetEncoding(args[2]);
  }
  catch (Exception ex)
  {
    Console.WriteLine(ex.Message);
    return;
  }

  if (!File.Exists(srcPath))
  {
    Console.WriteLine("入力ファイルがありません。");
    return;
  }

  string dstPath = srcPath;
  srcPath = Path.Combine( Path.GetDirectoryName(dstPath), Path.GetFileNameWithoutExtension(dstPath));
  srcPath += ".old.dbf";

  if (File.Exists(srcPath))
    return;

  File.Move(dstPath, srcPath);
  try
  {
    using (Stream fis = File.Open(srcPath, FileMode.Open, FileAccess.Read))
    using (var reader = new DBFReader(fis))
    using (Stream wfs = File.Open(dstPath, FileMode.CreateNew, FileAccess.ReadWrite))
    using (var writer = new DBFWriter(wfs))
    {
      reader.CharEncoding = srcEnc;
      writer.CharEncoding = dstEnc;

      writer.Fields = reader.Fields;

      object[] record = null;

      while ((record = reader.NextRecord()) != null)
      {
        writer.WriteRecord(record);

        debugRecord(record);
      }//end loop row
    }//end stream
  }
  catch (Exception ex)
  {
    File.Delete(dstPath);
    File.Move(srcPath, dstPath);

    Debug.Print(ex.Message);
    Debug.Print(ex.StackTrace);
  }//end try
}//end method

[Conditional("DEBUG")]
[DebuggerStepThrough()]
private static void debugRecord(object[] record)
{
  //以下デバッグ
  bool isFirstTime = true;
  foreach (var item in record)
  {
    if (isFirstTime)
    {
      isFirstTime = false;
      Debug.Write(item);
      continue;
    }

    Debug.Write(",");
    Debug.Write(item);
  }//end loop col
  Debug.Write(Environment.NewLine);
}//end method
カテゴリー: 運用, 開発 タグ: , パーマリンク