質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Q&A

解決済

3回答

865閲覧

不特定フォーマットを決まったフォーマットへ変換

Y.Uchi

総合スコア3

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

0グッド

0クリップ

投稿2021/05/10 08:08

前提・実現したいこと

不特定フォーマットの受取りデータを予めこちらで順番や、名称等で割振り
固定カラムのテーブルへデータをインサートする。

発生している問題・エラーメッセージ

解決案や、改善点を教えていただきたいです。

### WorkTable
|USER_CD|DATA_TYPE|NAME_MEI|NAME_SEI|AGE|SCHOOL
|:--|:--:|--:|
|1000|01|ter|tail|10|None

### ImportFormat
|USER_CD|DATA_TYPE|DATA1|DATA2|DATA3|DATA4
|:--|:--:|--:|
|1000|01|NAME_MEI|NAME_SEI|AGE|SCHOOL
|1100|01|NAME_SEI|AGE|SCHOOL|NAME_MEI

上記様に予め欲しいデータのレイアウト(WorkTable)に
不特定フォーマット(ImportFormatの1、2行目の様な感じ)をImportFormatテーブルにマスタ設定を行い
WorkTableへ綺麗にInsertしたいです。

考えてみているのですが、一向に解決できず、調べてみても記事が見つからず。。

答えではなく、ヒントや単語等、ご教授いただければと思います。

不明確な質問で申し訳ありませんが、お願い致します

該当のソースコード

.NET(C#),Oracle

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

VisualStudio2012

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/05/10 08:28

何かたぶん、質問として説明不足なのではないでしょうか。実例が良く分かりません。 ImportantFormatとは、提示の例としては1行目、「USER_CD="1000"の受け取りデータはDATA_TYPE="01"に相当し、DATA1からDATA4の4つのデータの並びが順番にそれぞれDBのテーブルで言うところの"NAME_MEI","NAME_SEI","AGE","SCHOOL" のカラム名に相当する。」ようなかんじなのでしょうかね。受け取りデータというものがファイルなのかファイルでもCSVだったりするのか、あるいは別のものなのか分かりませんが、もう少し具体的な説明が必要な気がします。
Y.Uchi

2021/05/10 09:19

ご回答、追記依頼頂き有難うございます。 上記ご回答させていただきます。 USER_CD、DATA_TYPEがPRIMARY KEYのテーブルを作成予定です。 ここで言うDATA_TYPEとは文字通りデータの種類です。 上記例ではユーザ情報になります。 USER_CDが1000のユーザのDATA_TYPEが01(ユーザ情報)のフォーマットは NAME_MEI,NAME_SEI,AGE,SCHOOLの順で来ているよという情報をマスタとして登録しようと思っていました。 受取りファイルはCSVファイルで現在はカンマで分解して配列に入れ、その後WorkTableへInsertしています。 CSVファイルの分解→WorkTableへの取込みまでは実装しており マルチなフォーマットに対応する為模索したが行き詰まっているという状況です。 まだ新米でご回答にになっていない部分があればお手数ですが再度ご指摘いただきたく思います。 宜しくお願い致します。
dodox86

2021/05/10 09:47

実運用を考えると、DBのテーブルへのデータ投入は各データの正当性を意外と厳密にチェックして必要に応じて適切にフォーマット、あるいは拒否しないとINSERTに失敗しがちですが、それは置いておいたとしても、具体的にどの部分にひっかかっているのかちょっと質問からは(少なくとも私は)分かりづらいです。SQLのINSERT文への変換をするにしても、OracleならSQL*LoaderでCSVファイルなどから一挙にデータ取り込むにしても、受け取りデータからWorkTableへINSERTする為に、各データを並び替えて投入用データにすればそれで済むような気がするのですが。そういう話ではなくて、でしょうか。
Y.Uchi

2021/05/10 14:10

下の回答者様に打った文章と同じで申し訳ありません。 自分の考えは下記になります。 並べ替える手順と言えばいいのか分からないですが 例えばUSER_CDが1100、DATA_TYPEが01のユーザが取り込みを行う際 ImportFormatテーブルからNAME_SEI,AGE,SCHOOL,NAME_MEIを取得します。 その後WorkTableにInsertするつもりですがWorkTableの順番に並べ替える方法でつまづいています。
asm

2021/05/10 15:27

csvにヘッダー行付けてやれば勝手に解釈してくれそうな気がするんですが Oracleのcsv読み込み機能は使わない縛りなのでしょうか?
dodox86

2021/05/10 17:19 編集

若干話が噛み合っていないかんじがしますが、例えばSQLのINSERT文なら、 INSERT INTO WorkTable (USER_CD, DATA_TYPE, NAME_MEI, NAME_SEI, AGE, SCHOOL) VALUES ('1000', '01', 'ter', 'tail', 10, NULL); -- Noneは適当にNULLにしている などと、カラム名の並びをやりたいように変えたり取捨選択できるし、外部ツールのSQL*Loaderを使う場合でも制御ファイルと言うものを作れば自由自在にできます。 C#, .NET Coreを使っているようですので、別の方法でやり取りされているのでしょうか。単純に、配列やList, Dictionaryで並び替える方法が分からないと言う話なのでしょうか。 回答欄でradianさんが書かれているように、ソースを提示した方が良いかもしれませんね。
Y.Uchi

2021/05/10 23:41

単純に、配列やList, Dictionaryで並び替える方法が分からないと言う話なのでしょうか。 この文章が一番適切かと思います。 Dictionaryに一度ファイルの中身を入れて、その後SQLでテーブルへ追加という手順です。 ユーザは何通りもあるとして、 ファイルの中身の1項目目がNAME_MEI、2項目目がAGEだと判断できるのはテーブルの構造上わかるのですが それをどの様にWorkTableと付き合わせるのかで苦戦しております。 一項目目がNAME_SEIなのは分かるが、WorkTableのどの位置にNAME_SEIがいるのかが分からないといった次第です。
退会済みユーザー

退会済みユーザー

2021/05/10 23:57 編集

読み込み元データがCSVなのであれば、それも質問に追記してください。 CSV⇒テーブル、テーブル⇒テーブルで話が変わってくるので。
dodox86

2021/05/11 00:58 編集

[不要なコメントであることが分かったので削除]
guest

回答3

0

少し別の作業に時間をずっと取られて本件について
即レスできそうにないので一度ベストアンサーを決めクロースとさせていただきます。

ご質問、追記依頼、回答、いただきました皆様有難うございます。

皆様のアドバイスを元に改めてもう一度チャレンジさせていただきます。

また、なにかつまづく様な事がありましたら質問を再度させていただくかもしれませんが
その時はどうぞ宜しくお願い致します。

投稿2021/05/12 14:07

Y.Uchi

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

正規化など、テーブル設計の基礎をきちんと勉強しましょう。ひとつの列には一つの意味しか持たせてはならない。
何度か正規化を無視した設計にでくわしました。テーブル設計をやり直すようにアドバイスして、それを受け入れたシステムはなんとか完成できました(スケジュールは大幅に遅れた)が、正規化を無視したシステムは全部破綻しました。

データベースの正規化 に沿って設計します。
通常第3正規化まで行います。

投稿2021/05/12 07:03

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

取り得る値とか、何か規則性やルールが無いと不可能でしょう。
AGEは数値なのでまだ判ると思いますが、NAME_MEIか、NAME_SEIどっちが入っているかをどうやって区別するんですか?SCHOOLも何が入るかよく判りません。

NAME_MEI、NAME_SEI、SCHOOLなどを既にそれぞれ別テーブルに持っていて、そこからマッチングして探せるとかなら可能かもしれませんが。(それでもNAME_SEIとNAME_MEI両方にあるパターン等は有り得そう)


ImportFormatテーブルのDATA1~4のカラムを転送元として出力したいなら、下記のようなイメージで行けるのではないかと。デバッグも何もしてないロジックを説明する為だけのソースなので、考え方だけ参考にしてください。

C#

1 var tableSrc = new DataTable(); //転送元(Worktableの内容と過程) 2 var tableDst = new DataTable(); //出力先 3 var tableFormat = new DataTable(); //ImportFormatの内容と仮定 4 5 //USER_CDとDATA_TYPEのTupleをキーにImportFormatのDictionaryを作る 6 var dicFormat = new Dictionary<(string, string), DataRow>(); 7 foreach(var row in tableFormat.AsEnumerable() ) 8 { 9 dicFormat[(row["USER_CD"].ToString(), row["DATA_TYPE"].ToString())] = row; 10 } 11 12 foreach(var rowSrc in tableSrc.AsEnumerable() ) 13 { 14 //DictionaryからUSER_CDとDATA_TYPEに対応するフォーマット取得 15 var rowFormat = dicFormat[(rowSrc["USER_CD"].ToString(), rowSrc["DATA_TYPE"].ToString())]; 16 17 //フォーマットを元に参照するカラムを切り替えて出力 18 var rowDst = tableDst.NewRow(); 19 rowDst["USER_CD"] = rowSrc["USER_CD"]; 20 rowDst["DATA_TYPE"] = rowSrc["DATA_TYPE"]; 21 rowDst["NAME_MEI"] = rowSrc[rowFormat["DATA1"].ToString()]; 22 rowDst["NAME_SEI"] = rowSrc[rowFormat["DATA2"].ToString()]; 23 rowDst["AGE"] = rowSrc[rowFormat["DATA3"].ToString()]; 24 rowDst["SCHOOL"] = rowSrc[rowFormat["DATA4"].ToString()]; 25 tableDst.Rows.Add(rowDst); 26 }

投稿2021/05/10 08:21

編集2021/05/11 01:42
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y.Uchi

2021/05/10 09:26

自分の説明不足で申し訳ありません。 上記のは例でSchoolなどはなにが入る等の想定をしておりませんでした。 失礼いたしました。 予め「この順番でファイルが送られてくる」というのは把握しております。 上記例で言うと、個人からもらえるフォーマットに合わせてテーブル等を作成していたが 複数人に使うシステムにしたい。 しかし、他の人は提出してくるファイルのフォーマットが違う。 個人ごとにプログラムを変更するのは汎用性が無い為、マスタに一度登録すればマルチに対応する事が可能な状態にしたい。 というのが経緯です。 宜しくお願い致します。
退会済みユーザー

退会済みユーザー

2021/05/10 10:59 編集

順序が判って居るなら、一旦データを取得した後にその通りに並べ替えてWorkTableに追加していけば良いのではないかと思いますが、何が引っ掛かってるんでしょう?
Y.Uchi

2021/05/10 14:09

並べ替える手順と言えばいいのか分からないですが 例えばUSER_CDが1100、DATA_TYPEが01のユーザが取り込みを行う際 ImportFormatテーブルからNAME_SEI,AGE,SCHOOL,NAME_MEIを取得します。 その後WorkTableにInsertするつもりですがWorkTableの順番に並べ替える方法でつまづいています。
退会済みユーザー

退会済みユーザー

2021/05/10 15:19

それだけ聞いても、何をアドバイスすればいいかこっちには判らないので、もっと具体的にお願いします。並び替え無しなら追加出来てるのでしょうか? とりあえず現状C#で実装出来てるソースを提示してください。 [質問するときのヒント] https://teratail.com/help/question-tips
Y.Uchi

2021/05/10 23:36

並び替えの問題を除けばInsert等は問題無く現状実装できております。 勤め先業務ソフトウェアですのでCodeの抜粋が少しお時間いただかないとできず、 言葉で解決できればと思った次第でした。 まとまった回答をお返しさせていただきたく思うので少しお時間いただきたく思います。 宜しくお願い致します。
退会済みユーザー

退会済みユーザー

2021/05/11 01:41

並び替えだけ出来ないという前提で、とりあえずサンプルソースを追記しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問