• ベストアンサー

テキストデータを加工してDBで扱えるようにする方法

以下のような文字列をエクセルで扱える形にしたい と思っています 具体的にどのようにしたらいいでしょうか よろしくお願いします (説明) テキストエディタは秀丸を使っています perlはまだ使ったことがありませんが できるようであればインストールも考えています (データの特徴) Aフィールドがデータの最初に必ずあります 他のフィールドは任意です フィールドと値の区切りは最初のスペース群(1個以上)です 値の間にスペースがある場合もあります 実際は40フィールド、1万件ほどあります A 1 B  2 2 C 3 A 4 C   55 A 6 B 77 77 A 8 B 99 C  10 10 A  11 B 12 12 12 C 13 ↓ A,B,C 1,2 2,3 4,,55 6,77 77 8,99,10 10 11,12 12 12,13

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

ありゃ、だめだ。#2です。  ($alpha,$num) = (substr($_,0,1),substr($_,1)); この行を @ary = split(/\s/,$_); $alpha = shift(@ary); $num = substr($_,length($alpha)); に差し替えてください。

arumisoy
質問者

お礼

このたびは皆さんにお世話になりました。perlやVBA、秀丸のマクロを使いこなせるようになるには時間がかかりそうなのでここで締め切ります。ポイントはつけましたが同じくらいですのでご了承ください

その他の回答 (4)

回答No.4

#2です。 perlでやるとこんな感じです。 @fieldに実際のフィールド名を入れてください。 もちろん、VBAでもできると思います。 perlのほうがコード書くの楽なので perlでやっただけです。 @field = ("A","B","C"); for($i=0;$i<=$#field;$i++){  $hash{$field[$i]} = $i; } print join(",",@field); while(<>){  ($alpha,$num) = (substr($_,0,1),substr($_,1));  $num =~ s/^[\s ]+//;  $num =~ s/[\s ]+$//;  if($hash{$alpha} == 0){   print "\n$num";   $chk = 0;   next;  }else{if($hash{$alpha} == $chk){    print ",$num";   }else{    print "," x ($hash{$alpha} - $chk)."$num";   }  }  $chk++; }

arumisoy
質問者

お礼

ありがとうございます。perlをインストールしてみようと思います

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.3

> フィールドは26文字をこえていないです という事でなくて、例の場合はABCの3通りですが、 40通りの場合、ABCD…XYZの26通りの次の27~40通りまではどういう文字が来るのでしょう?という意味だと思います。 A~Zの文字は区別できなくなるし、数字もデータとの区切りが出来なくなりますね。 それとも、実際はアルファベット1文字でなくて単語みたいなもの? -- > 1万件×40行です って事は、40万行のテキストファイルですか? Excelの最大行数は6万5千行ですので、こちらに直接取り込むのは却下ですね。 -- テキストエディタの機能なんかでは辛そうですし、ExcelのVBAで読み込み処理を記述するのがコンパクトで楽かも。

arumisoy
質問者

お礼

ありがとうございます。 以下にも書きましたがおっしゃるように単語みたいなものです。 「ExcelのVBAで読み込み処理を記述」という方法を検討してみます

回答No.2

>実際は40フィールド、1万件ほどあります とありますが、 フィールド文字のアルファベットは 26文字ですよね。 その先はどうなってるんですか。

arumisoy
質問者

お礼

先のneKo_deuxさんのコメントで気がつきました フィールド名は1文字ではなく アルファベットと_を使っています たとえばABC_CD_E_FGのようなものです 失礼しました

arumisoy
質問者

補足

ありがとうございます。 フィールドは26文字をこえていないです 40通りのフィールドが終わるとその先は 2件目のデータがAフィールドから始まり 全部で1万件ほどとなっています (値のないフィールドもあるので最大で 1万件×40行です)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

とりあえず秀丸をお使いでしたら 1.正規表現で置換をおこない、A~Cと後続のスペースを削除する 検索:^[A-C] + 置換:何も入力しない *正規表現のところのチェックを忘れずに。意味はヘルプを 2.Shift+F1でこんなキー操作を記録する エンドキー カンマ デリート エンドキー カンマ デリート 下キー 3.カーソルをファイルの先頭に戻し、Shift+F2を押しっぱなしにする。 4.先頭行に、 A,B,C を追加する でいけるかな? この変換作業を何度もやるのであれば、これらの作業をすべて自動化する マクロを組んだほうが楽だと思いますが。

arumisoy
質問者

お礼

ありがとうございます。秀丸でShift+F1、Shift+F2の操作を したことがなかったのでトライしてみます。

関連するQ&A

  • テキストファイルのデータをエクセルへコピーのやり方

    よろしくお願いします。 エクセル2000を使っています。 テキストのデータで A1/B1/C1    /はスペースです。 D1/E1/F1    データの長さは全部違います。 A2/B2/C2     D2/E2/F2 A3/B3/C3     D3/E3/F3      ・    ・(続く) といったものがあります。これをエクセルで    A列 B列 C列 D列 E列 1行 A1 B1 C1 D1 E1 2行 A2 B2 C2 D2 E2  ・・・ 3行 A3 B3 C3 D3 E3  (続く)          ・          ・(続く) という感じで別々のセルにいれて貼り付けしたいのです。 テキストデータを別々のセルに貼り付けする方法は 過去ログで「区切り位置」というのをつかえばいいというのはわかりましたが、この場合の複数行にわたるテキストデータをエクセルの1行に貼り付けする方法がわかりません。また、データの長さが違うために「区切り位置」もうまくいきません。 良い解決法をお願いします。

  • 固定長データのテキストファイルのスペースについて

    固定長データのテキストファイルをExcelで読み込むと、スペース部分が前詰めされてしまいます。 スペースもそのままカラムとして読み込む方法はありませんでしょうか。 例えば次のような固定長データがあるとします; No.  項目名   タイプ   桁数 1    コード    文字    6 2    状態    文字    10 テキストファイルで開くと下記のような表示です(以下、便宜上スペースを”_”で表します); data011________1 data02_________1 data03____1_____ これをExcelにて固定長フィールドのデータとして読み込む際、 フィールドの区切り位置として6カラム目と16カラム目に矢印を置き 全てのフィールドを文字列として読みこむとExcelでは下記のように表示されます;       A列   B列    1行目  data01 1________1 2行目  data02 1 3行目  data03 1 ここで、B2セルとB3セルがそれぞれ _________1 ____1_____ とスペースを保持したままの形で読み込む方法はありませんでしょうか。 手動でもVBでもかまいません。ご教示頂ければ幸いです。

  • データのテキストファイル抽出

    データの抽出に困っています。 エクセルデータにてA~Lのフィールドに値が入っていて、1000レコード程のデータを ・1レコードずつ ・A列のフィールドをファイル名に ・テキストファイルに出力 ・テキストファイルには1レコードを縦に、フィールドごと改行して並べる 上記のようにして作成する必要があります。 今までは、 A B C...K L となっているデータの列と行を入れ替えて A B C . . K L としてテキストファイルを作成し、セルAのフィールドをファイル名にして、 手作業で1列ごとにコピー&ペーストして行っていました。 非常に効率が悪いので、全自動化もしくは一部自動化出来ないかと試行錯誤していますが 良い方法が見つけられません。 何か良い方法をご存知の方がおりましたら教えて下さい。

  • メモ帳(テキストデータ)をExcelにセルに分けて貼り付ける方法は?

    例えば、以下のようなメモ帳(.txt)のデータをExcelに貼り付ける際に、スペースが空いているもの単位で、セル別に貼り付ける方法はございますでしょうか? (データ例) 100 150 130 200 200 230 このデータについては、100→A1、150→B1などセル毎に貼り付けたいと考えております。 A1 B1 C1 A2 B2 C2

  • Access2000データのテキストファイル変換方法について

    いつもお世話になっております。 以前、この欄で質問させて頂いたCSVデータ変換の件については随分助かり、ありがとうございました。 このたび、Access2000のデータを、テキストファイル(タブによる区切り)に変換(明細ごとの区切りは改行文字を使用)する必要があり、下記のような記述を致しましたが、どうしても、「カンマ区切り」にしかなりません。 インターネットで調べると、テキスト(タブ区切り)の拡張子は「.txt」と説明されているのですが、何か記述が間違っているのでしょうか? 宜しくお願い致します。 (追伸)将来、必要になるかも知れないので、テキスト(スペース区切り)の記述についてもお願いできれば、と思います。 -- 記述内容 --------------------------------------------------- Dim adoRs As New ADODB.Recordset Dim strsql As String Dim strFile As String Dim 番号 As Long strsql = "SELECT" For 番号 = 1 To 34 If 番号 > 1 Then strsql = strsql & "," strsql = strsql & "フィールド" & CStr(番号) Next 'strsql = strsql & "FROM WT売掛管理表 ORDER BY フィールド1" strsql = "SELECT フィールド1,フィールド2,フィールド3,フィールド4,フィールド5,フィールド6,フィールド7,フィールド8,フィールド9,フィールド10,フィールド11,フィールド12,フィールド13,フィールド14,フィールド15,フィールド16,フィールド17,フィールド18,フィールド19,フィールド20,フィールド21,フィールド22,フィールド23,フィールド24,フィールド25,フィールド26,フィールド27,フィールド28,フィールド29,フィールド30,フィールド31,フィールド32,フィールド33,フィールド34 " & _ "FROM WT売掛管理表 ORDER BY フィールド1" adoRs.Open strsql, CurrentProject.Connection strFile = "C:\データフォルダ\変換データ.txt" Open strFile For Output Access Write As #1 Do Until adoRs.EOF For 番号 = 0 To 32 Write #1, CStr(adoRs.Fields(番号).Value), Next Write #1, CStr(adoRs.Fields(番号).Value) adoRs.MoveNext Loop adoRs.Close Close #1 MsgBox "データ変換処理が終了しました。", vbInformation Exit Sub -----------------------------------------------------

  • ファイルメーカーで複数条件データを抽出する方法

    filemaker で、複数条件のデータ抽出を行いたいのですがその方法が分かりません。 フィールドAとフィールドBにそれぞれaまたはb、cまたはdの値が入力される場合、aかつc、aかつd、bかつc、bかつdの件数を求めたいと 考えております。 =Exact(A;"a")and Exact(B;"c")のように入力してみましたがうまくいきませんでした。 知恵をお貸し頂ければ幸いです。 宜しくお願い致します。

  • Accessで2つのテーブルのデータの整合性を確認したい

    Accessで2つのテーブルのデータの整合性を確認したいのですが、よい方法を教えていただけませんか? 状況は以下のとおりです。 Aテーブル    a   b    c   d   e       1  111  222  333  444  555 2  666   777 888 999 100 3   110 112 113 114 115 Bテーブル    a   b    c   d   e       1  111 222 333 444 555 2  666 777 000 999 100 3   110 112 300 400 500 ・AテーブルとBテーブルがあり、それぞれのテーブルのa、b、dフィールドのみを対象に、その値がAテーブルとBテーブルとで等しいかどうか調べたい。 (c、eフィールドの値が異なっていても、a、b、dフィールドの値が同じであればそのレコードはOKとし、a、b、dフィールドで1つでも異なる値があればNGとし、抽出したい。 例えば、Bテーブルの1、2レコードはOKだが、3レコードはNG) ・それぞれのテーブルのaフィールドが主キーになっている。 うまく説明できず、わかりにくいかもしれませんが、よろしくお願いします。

  • リトルエンディアンのデータをテキスト変換して利用したい

    いつもお世話になっています。 ある観測生データが「リトルエンディアン」という形式のバイナリファイルです。 これをテキストに変換して、DBに取り込んで利用したいです。 環境としては、Accessの標準モジュールにその機能を作りたいです。 (Visual Basicなどは持っていないので^^;) やりたいことは、 1)当該のファイルを読み込んで、 2)テキストに変換した後、 3)テキストファイルに書き出して、 4)再度それを固定長の定義に従ってDBに取り込んで、 5)必要なフィールドのみ利用したい、 ということです。 この流れのうち、1)と2)がわかりません。 VBAで上記の1)、2)は可能でしょうか? 可能だとしたら、どのような方法がありますか? 3)以降は、Open やPutなどでテキストファイルを書き出すのと同じでよいでしょうか? なお、秀丸エディタのバイナリモードでファイルを開くと、次のように見えます。(行末に必ず","があります) 91,01,D7,07,02,00,07,04,00,00,A1,62,9F,53,1C,00, 75,00,0F,00,12,00,EA,00,E9,00,80,1F,96,6B,8A,43, 93,B9,92,74,93,E0,8E,73,8A,4A,89,5E,82,51,92,9A, いかがでしょうか?

  • Access 複数フィールドにまたがる抽出条件

    Access2016で、クエリの抽出条件の設定に悩んでいます。解決策をご存知の方はご教示いただきますようお願い致します。 ★やりたいこと★ 【テーブル1】に以下のようなフィールドがあります。 [フィールドA] "製品a" "製品b" "製品c ..." のようなデータ群 [フィールドB] "00 "01" の2種類のデータ群 [フィールドC] "98" "99" の2種類のデータ群 フィールドBが "00" で、かつフィールドCが "98" に該当するデータのみを除外する抽出条件を設定したい。 ※フィールドBが "00" でフィールドCが "99" のようなデータは除外したくない SQLとかは使わず、初心者でも後から解読・編集できるような方法があればありがたいです。

  • 項目抜き出しセット

    現在、FIELD_A に次の値が入っています。   FIELD_A = "123 45"    * 3と4の間は半角スペースが入っている。 これを、FIELD_BとFIELD_Cの2つのフィールドに 次のようにセットすることはできるのでしょうか?   FIELD_B = "123"   FIELD_C = "45" よろしくおねがいします。