- 投稿日:2022-02-28T10:30:48+09:00
C#で銀行の取引明細の中から売掛金の回収分を会計データにコンバートする。
はじめに 銀行の取引明細より売掛金の回収分を会計データにコンバートする必要があったので変換プログラムを作成しました。 概要 今回はPayPay銀行の取引明細をコンバートします。 PayPay銀行の取引明細は、 以下のような仕様になっています。 "操作日(年)","操作日(月)","操作日(日)","操作時刻(時)","操作時刻(分)","操作時刻(秒)","取引順番号","摘要","お支払金額","お預り金額","残高","メモ" "2021","6","22","11","12","33","0000101","ローソンATM入金","","1000","1000","" "2021","6","22","11","11","55","0000101","振込 ウォレット ウケトリ","","10000","11000","" ... この中より適用に振込と記述ある行データのみを抽出して会計データの形式に変換します。 銀行のデータは売掛金の回収分のみなのでそれに対応した売上の明細行を出力します。 回収分 借方 貸方 普通預金PayPay銀行 10,000円 売掛金 10,000円 追加分 借方 貸方 売掛金 10,000円 売上 10,000円 プログラムコード(一部抜粋) using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ReadPaypayDataConsoleApp { class Program { static void Main(string[] args) { FileStream f = new FileStream("C:\\Users\\user\\Downloads\\paypay銀行明細データ.csv", FileMode.Open); FileStream fout = new FileStream("C:\\Users\\user\\Documents\\Yayoi\\Exchange\\paypayインポートテストデータ.txt", FileMode.OpenOrCreate); StreamReader r = new StreamReader(f, Encoding.GetEncoding("Shift_jis")); StreamWriter w = new StreamWriter(fout, Encoding.GetEncoding("Shift_jis")); string[] headerLine = null; int renban = 0; while (r.EndOfStream == false) { var line = r.ReadLine(); if (line == "") break; Hashtable ht = new Hashtable(); string[] strArray = line.Trim().Split(','); if (strArray[0] == "\"操作日(年)\"") { headerLine = strArray; } else if (strArray[7] == "\"振込 ウォレット ウケトリ\"") { string str = ""; str = "\"2000\"" + "," + (200 + renban).ToString() + ","; str += "\"\"" + ","; //決算 string tmp = "\"R.03/" + String.Format("{0:D2}", int.Parse(strArray[1].Replace("\"", ""))) + "/"; tmp += String.Format("{0:D2}", int.Parse(strArray[2].Replace("\"", ""))) + "\","; str += tmp; str += "\"普通預金\"" + ","; //借方勘定科目 str += "\"PayPay銀行\"" + ","; // 借方補助科目 str += "\"\"" + ","; //借方部門 str += "\"対象外\"" + ","; //借方税区分 str += strArray[9].Replace("\"","") + ","; //借方金額 str += "0" + ","; //借方税額 str += "\"売掛金\"" + ","; //貸方勘定科目 str += "\"ヤフー\"" + ","; //貸方補助科目 str += "\"\"" + ","; //貸方部門 str += "\"対象外\"" + ","; //貸方税区分 str += strArray[9].Replace("\"", "") + ","; //貸方金額 str += "0" + ","; //貸方税金額 str += "\"" + strArray[7].Replace("\"", "") + "(回収)\"" + ","; //摘要 ... str += "\"no\""; //調整 System.Console.WriteLine(str); w.WriteLine(str); renban++; string str2 = ""; str2 = "\"2000\"" + "," + (200 + renban).ToString() + ","; str2 += "\"\"" + ","; //決算 tmp = "\"R.03/" + String.Format("{0:D2}", int.Parse(strArray[1].Replace("\"", ""))) + "/"; tmp += String.Format("{0:D2}", int.Parse(strArray[2].Replace("\"", ""))) + "\","; str2 += tmp; str2 += "\"売掛金\"" + ","; //借方勘定科目 str2 += "\"ヤフー\"" + ","; // 借方補助科目 str2 += "\"\"" + ","; //借方部門 str2 += "\"対象外\"" + ","; //借方税区分 str2 += strArray[9].Replace("\"", "") + ","; //借方金額 str2 += "0" + ","; //借方税額 str2 += "\"売上高\"" + ","; //貸方勘定科目 str2 += "\"\"" + ","; //貸方補助科目 str2 += "\"\"" + ","; //貸方部門 str2 += "\"課税売上込10%\"" + ","; //貸方税区分 str2 += strArray[9].Replace("\"", "") + ","; //貸方金額 str2 += "0" + ","; //貸方税金額 str2 += strArray[7] + ","; //摘要 ... str2 += "\"no\""; //調整 System.Console.WriteLine(str2); w.WriteLine(str2); renban++; } //System.Console.WriteLine(line); } r.Close(); w.Close(); f.Close(); fout.Close(); } } } 参考
- 投稿日:2022-02-28T09:42:48+09:00
C#で会計データのコンバートを行う。
はじめに 汎用形式の会計データをコンバートしてインポートする機会があって、 C#で会計データの変換プログラムを作成しました。 要点 汎用形式の会計データはCSV形式で表題行、明細行、日次合計行、月度合計行があり、表題行と明細行のみを抽出して、表題業の列名を使って連想配列に格納し、順番を変えてテキストファイルとして出力します。今回は弥生データにコンバートしました。 発生した問題点 csvデータが文字化け 簡単に対処できると思いましたが、csvデータが文字化けしました。ファイルがShift-jis形式だったのでストリームでエンコーディングを指定して読めるようになりました。 ※必ず元データはバックアップを取っておいてください。 プログラムコード(一部抜粋) using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ReadKaikeiDataConsoleApp { class Program { static void Main(string[] args) { FileStream f = new FileStream("C:\\Users\\user\\Documents\\Yayoi\\Exchange\\テストデータ.txt", FileMode.Open); FileStream fout = new FileStream("C:\\Users\\user\\Documents\\Yayoi\\Exchange\\インポートデータ.txt", FileMode.OpenOrCreate); StreamReader r = new StreamReader(f, Encoding.GetEncoding("Shift_jis")); StreamWriter w = new StreamWriter(fout, Encoding.GetEncoding("Shift_jis")); string[] headerLine = null; while (r.EndOfStream == false) { var line = r.ReadLine(); if (line == "") break; Hashtable ht = new Hashtable(); string[] strArray = line.Trim().Split(','); if (strArray[0] == "\"[表題行]\"") { headerLine = strArray; } else if (strArray[0] == "\"[明細行]\"") { if (strArray.Length != 29) { System.Console.WriteLine("明細行エラー"); break; } for (int i = 0; i < strArray.Length; i++) ht[headerLine[i]] = strArray[i]; //System.Console.WriteLine(line); string str = ""; str = "\"2000\"" + "," + ht["\"伝票No.\""] + ","; str += ht["\"決算\""] + ","; ... str += ht["\"調整\""]; System.Console.WriteLine(str); w.WriteLine(str); } } r.Close(); w.Close(); f.Close(); fout.Close(); } } } 結果 うまく変換できました。 参考
- 投稿日:2022-02-28T03:31:10+09:00
[C#]フォルダが削除できないときの雑な対策
発生条件 一瞬の間にフォルダ作成とフォルダ削除を行おうとすると下記例外が発生した。 System.IO.IOException : The process cannot access the file 'ccc0.txt' because it is being used by another process. 解決方法 非同期でかつ遅延させて実行するとうまく行った。 Task.Run(async () => { await Task.Delay(500); // 500ms遅延 Directory.Delete("aaa", true); // フォルダ削除 }); ※遅延の秒数は適当。短いと失敗しやすい傾向にあったので、500[ms]に落ち着いた。コメント頂いてるように、真剣にやるときは遅延とリトライを繰り返す機構があるといい。 背景 xUnitでファイルをいじるロジックのテストを書く場面があり、テスト用ファイルの生成/削除をコンストラクタとDispose()で行おうと思い立った。 とりあえずその部分の動作だけ確かめようとしたところ、冒頭の例外発生。 他のプロセスに使われているというメッセージだがそんなわけがない。多分、ファイル生成してすぐだから自分のプロセスのことなんだろう。 テストケース内にいくらか時間がかかる処理が書かれれば起きなくなるトラブルなんだろうけど、エラーメッセージと直接原因が噛み合わないケースなので情報共有。