- ベストアンサー
テキストファイルの変換・整形について
ときわや TEL 076-521-0139 〒939-8201 山形県富山市棟園町3丁目7-17 米屋 米蔵屋 TEL 012-854-0139 〒551-2312 秋田県高時市川辺町7丁目1 -12 米屋 --------------------------------------------- 1行目から4行目までを一列。5行目から8行目までを一列に出来るソフトなどご存知あれば教えていただけませんか?また「"」「,」などを間に入れたいです。 "ときわや","076-424-0139","939-8201","山形県富山市棟園町3丁目7-17","米屋" "米蔵屋","012-854-0139","551-2312","秋田県高時市川辺町7丁目1 -1","米屋" ↑出力結果をこんな感じにしたいのです。 処理するテキストが大量に続き困ってます。 複数のソフトの組み合わせでも結構です。 ヒントお願いいたします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
#6 のakiracoolさんへ Wendy02と申します。 こちらが触れたことについて、文章的に何か、不快感を表されたようにも読み取れます。私の書いた内容について不足があり、もし誤解されていたらすみませんです。 文面の中で、アクセス(Ms-Access)について触れていましたので、一般的には、Accessをお持ちの方はそれほど多くはありません。その部分について、Windows のみで可能だと書いたわけです。 つまり、#5の私の内容は、「" "(クォーテーション)」をつける作業について触れたものです。これについては、私には、Excelのワークシートで、明確な解決方法が見出せませんでした。データベース系のCSVでは、「" "(クォーテーション)」が必要になるものもありますが、Excelは、インポートが主ですから、出力にはあまり柔軟な対応はしないように思います。 しかし、もし、VBAの処理なら、最初からすればよいので、途中から、VBAの解決方法というのもおかしいです。VBAがお分かりにならない方のために、VBAも使わない、Windowsだけの(WSH)VBScript の処理を考えてみました。(程度の差はあれ、プログラムには違いありませんし、最初から、WSHで作るのもやぶさかではありませんが、やはりVBAのほうが表現力はすぐれています。) また、一方で、Excelの出力には、スペース区切りの prn 出力という方法があります。書式で、「!"@!"」という方法でワークシート上の文字列を加工します。しかし、固定長なので、空白が入ってしまいます。また、「,(カンマ)」がありません。 そこで、空白を取り除き、「.(カンマ)」に換えなくてはなりませんので、テキストエディタなどが必要になってしまいます。 それでは、最初から、正規表現のあるテキスト・エディタやテキスト・ストリーム・エディタで行ったほうが早いことにもなってしまいます。この部分で、VBAの分からない方に、ワークシートの操作のみで解決できれば、それに越したことはないように思いました。
その他の回答 (7)
- akiracool
- ベストアンサー率26% (11/42)
#7の Wendy02さんへ #3、4、6のakiracoolです。 こちらこそ、すいません。 #3・4なのにNO2・3と書いてしまいました。 いつもぱぱっと書いて送信してしまうので・・ 誤解を招いてしまったようです。 ここのカテゴリに質問する方はエクセルの方もけっこう多いので、 エクセルで作ったものからテキストファイル「への」変換と はやとちりして回答してしまいました。 Wendy02さんの回答に何ら言うことはありません。 むしろ、私の知らない範囲のこともあり 興味深く、感心しております。 どうか、私のことは気になさらないで下さい。
お礼
akiracool様 少々時間がかかると思いますが、がんばってみます。 3人様の書き込みありがとうございます。 当方の頭はこれらの良心的なご回答でパンパンです(^_^;) しかしみなさんどんな仕事なさってるんでしょうか? 違う方向の興味などわいてしまう書き込みばかりでした。 また機会あればぜひぜひよろしくお願いいたしますm(__)m
- akiracool
- ベストアンサー率26% (11/42)
NO2・3のakiracoolです。 エクセルでの話と思ってました。 そうででないなら、とばして下さい。 他の方を参考になさるといいと思います。
お礼
はじめまして、akiracool様。 ソフトはなんでもかまわないんですよ。 それ以外でも私の低いスキルでついていければかまいません。結果がでればそれで良いんです。 ソフトはアクセスもあります。 整形したいデータは空行も含めて約1万から3万行です。 件数では約3万から10万件です。 趣味でウェブサイトを作ったり、夜にちょっとネット見る程度のスキルです。 その程度のPCさわってる私にデータ処理の話しが来たわけです。 こんな資料を扱うのは初めてなんですよ。読み込ませるソフトはアクセスです。 アクセス自体、初めてで本を読みながらってところです。 お二人の書き込みに感心してわくわくしております。 ただし今日も仕事中(^_^;) ウンウンうなりながらPCに向き合いたいと思います。 どんな方法でも私にはありがたく感謝しておりますm(__)m またよろしくお願いします。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。Wendy02です。 #2の取り付けの仕方を説明しておきます。 Excelがお持ちだという条件の上でお話させていただきます。 Excelを立ち上げて、Alt + F11 を押すと、Visual Basic Editor 画面に変わります。 次に、メニューの挿入-標準モジュール をクリック 現れた白い画面に、コードを貼り付けます。 セルのポインターが、そのコード上にあることを確認して、F5 を押せばよいです。 これで、私のほうの話は終わります。 ****************************************** なお、#3,#4 のakiracool さんの方法で、 >■CSVで保存します。 > >名前をつけて保存で、CSVカンマ区切りで保存です。 >この状態で、コンマのついたデータができあがります。 > >以下、ダブルコーテーションをつける作業です。 ←ここの部分です。 これは、一般のWindowsだけでも出来ます。最初から、VBAで処理するなら別ですが、Excelのワークシートでは、私は、分かりませんでした。 一旦、このようなCSV ファイルが出来ましたら、 「ときわや,076-521-0139,939-8201,山形県富山市棟園町3丁目7-17,米屋」 メモ帳に、下に掲げたコードを貼り付け、例えば、 ファイル名を [ CSV変更.vbs ] (かぎカッコはいりません) とでもして、CSV ファイルのあるところに、このテキストファイルを置いてください。エキスプローラで、CSV ファイルを、ここにドラッグ&ドロップすれば、n_ファイル名.csv という名称が出来ています。新しい、 "ときわや","076-521-0139","939-8201","山形県富山市棟園町3丁目7-17","米屋" という内容に変わっているはずです。(確か、IE の4.0以上なら動くはずです) (以下は、全角空白は入れてはいけません。エラーが発生します。ソースには、半角空白は入っています。) '-------------------------------------------------- 'CSVを加工するWSHプログラム Set objFso = CreateObject("Scripting.FileSystemObject") fname = WScript.Arguments.Item(0) If objFso.GetExtensionName(fname) = "csv" Then Set objTxIn = objFso.OpenTextFile(fname) path = objFso.GetParentFolderName(fname) & "\" txOut = path & "n_" & objFso.GetFileName(fname) Set objTxOut = objFso.CreateTextFile(txOut) Set objRegexp = New RegExp With objRegexp .Pattern ="([^,]+)" .Global=True End With Do Until objTxIn.AtEndOfStream =True txTmp = objTxIn.ReadLine() Set Matches = objRegexp.Execute(txTmp) For Each Match in Matches txOut = objRegexp.Replace(txTmp, """" & "$1" &"""" ) Next objTxOut.WriteLine(txOut) Loop objTxOut.Write(txOut) objTxIn.Close() objTxOut.Close() MsgBox("終了") Else 'CSVファイル以外の場合 MsgBox("CSVファイルをドラッグドロップしてください") End If
- akiracool
- ベストアンサー率26% (11/42)
訂正です。(このままでも問題ないと思いますが、一応統一しときます) ■6 G1 =IF(D1<>0,MID(C3,10,30),0) ※住所最長30文字あると仮定してます。 H1 =IF(D1<>0,C4,0) IF文の次が、2つがE1になってましたので、2つともD1でそろえてください。※他は何も変えないで下さい。 また何か不明点あれば言ってください。
- akiracool
- ベストアンサー率26% (11/42)
以上のはセルに1行ずつ入っているんですよね。 エクセルで、","の入ったものまでを作ります。 最後の ""ダブルコーテーションの作業だけ、アクセスを単純に使いますが、それまですべてエクセルで作業可能です。 (アクセスは、以下の作業でできたCSVファイルを取り込んで、エクスポート(保存)するだけです。非常に簡単な作業ですので、やったことなくても、まず大丈夫だと思います) 難しくないので、一度やってみるのもいいと思います。 ※元データは、【必ず】コピーして保存しておいてください。 ----------- 以下、説明です。 仮にA列に入っているとします。 A1=ときわや A2=TEL 076-521-0139 A3=〒939-8201 山形県富山市棟園町3丁目7-17 A4=米屋 A5=米蔵屋 A6=TEL 012-854-0139 A7=〒551-2312 秋田県高時市川辺町7丁目1 -12 A8=米屋 以下ずっと続く・・ ※現在A列が元データとすれば、C列にあらたに作った元データ基本として、D列以降に実際いるデータを出してきます。 ■1・・・左に、列を挿入してください。→A列の元データが、すべてB列に移動します。 ■2・・・挿入したA列に、とりあえず名前をいれ下さい A1=名前 A2=電話 A3=住所 A4=種類 ■3・・・オートフィルで、A1~A4を選択。A4の一番右下のオートフィルのマーク(■)をダブルクリックしてください。 →一番下のデータまで、オートフィルが入るはずです。 ■4・・・C列セル入力です。※余白をとってしまいます。余白2つとかあると、後々データ処理に困るのでします。 C1 =IF(LEFT(B1,1)<>"〒",B1,SUBSTITUTE(SUBSTITUTE((B1)," ","")," ","")) 3と同じ容量で、右下■をダブルクリックで下までオートフィルができます。 →これにより、C3=〒939-8201山形県富山市棟園町3丁目7-17 となり、文字の左から10文字目は必ず住所になるはずです。 ■5・・・D1~セル入力です。 D1 =IF(A1="名前",C1,0) E1 =IF(D1<>0,C2,0) F1 =IF(D1<>0,LEFT(C3,7),0) G1 =IF(E1<>0,MID(C3,10,30),0) ※住所最長30文字あると仮定してます。 H1 =IF(E1<>0,C4,0) ■6・・・D1~H1を選択し、反転したまま、4つ同時にオートフィルです 右下(■)ダブルクリックです。 ときわやTEL 076-521-0139〒939-82山形県富山市棟園町3丁目7-17米屋 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 米蔵屋 TEL 012-854-0139 〒551-23 秋田県高時市川辺町7丁目1-12 米屋 こんな感じででるはずです。 ■7・・・新しいシートを使います。 新しいシートを用意し、「リンク付」とシート名を変更し下さい。 ■8・・・先ほどのシートにもどり、できたD1~H10000(くらいでしょうか)を 「Ctr」と「Shift」と「→」「↓」で全選択で、コピー 新シート(「リンク付」)に移動。 A1で右クリック>形式を選択して貼り付け>左下の「リンク貼り付け」を選択してください。 →■上記の6の表と同じようなものがでているはずです。 ■9・・・・「リンク付」シートを加工します。 A1をクリック 「Ctr」と「Shift」と「→」、「↓」で全選択。 そのまま、メニュー>編集>下の「ジャンプ」>ダイアログボックス一番左下の「セル選択」 上から左3つめ 「数式」と「数値」をチェックで「OK」→0がすべて選択されます。 編集で 「削除」、「上方向にシフト」です →0が消え、不要な列が削除されました。 ■CSVで保存します。 名前をつけて保存で、CSVカンマ区切りで保存です。 この状態で、コンマのついたデータができあがります。 以下、ダブルコーテーションをつける作業です。 ■アクセスをたちあげます。 1・・空のデータベースを用意します。 2・・ファイル>外部データの取り込みで、先ほどのCSVファイルを取り込みます。 ※IDを作成しないでください。そこだけチェックをはずしてください。 ※分からなくても、あとで列を削除すればいいだけです。 3・・ファイル>エクスポートでCSVで保存です。 以上で、できあがりです。 こちらには、かなり達者な方がたくさんいらっしゃると思うので アクセスがないようならエクセルでできるか聞いてみるのもいいかもしれません。 ただ、大量のデータがあるなら、アクセスは使いこなせたら便利なものです。 ざっと作って8行しか作業確認してないので もし式がおかしかったら、または何か勘違いしていたら、すぐに言って下さい。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 一応、すべて、VBAのコードで(Excel上のコードは使わずに)作りましたので、Excelでなくても出来るとは思いますが、一応、開発は、Excelの VBAで行いました。Excelのワークシートは使っていません。プロシージャを起動すると、ダイアログが開いて、テキストファイルを選びます。短いものでしたら、瞬時に出来てしまいます。バックアップファイルは、$ 付きのファイル名に変わりますので、万が一失敗した時は、それを戻してください。 ひとつだけ心配なのは、 〒939-8201 山形県富山市棟園町3丁目7-17 ↑ かならず、半角・全角いずれかのスペースが入っていないと、現行のコードでは区切ることが出来ません。 〒939-8201 ここの数字は、半角が条件です。 出されたサンプルでは問題が発生していませんが、様々なデータの場合は、完全だとは言えません。 '---------------------------------------------------------------- '標準モジュール Sub CSVMaking() '4行の文字列を一つにして、CSV を作成する Dim FileName As String Dim myPath As String Dim myOutFile As String Dim inFileNo As Integer Dim TextLine As String Dim outFileNo As Integer Dim buf As String Dim tmp As String Dim i As Integer FileName = Application.GetOpenFilename ("テキスト(*.txt),*.txt") If FileName = "False" Or FileName = "" Then Exit Sub myPath = Mid$(FileName, 1, InStrRev(FileName, "\")) FileName = Replace(FileName, myPath, "") myOutFile = Mid$(FileName, 1, InStrRev(FileName, ".") - 1) & ".bak" inFileNo = FreeFile() Open myPath & FileName For Input As #inFileNo outFileNo = FreeFile Open myPath & myOutFile For Output As #outFileNo ' Do While Not EOF(inFileNo) Line Input #inFileNo, TextLine If TextLine <> "" Then i = i + 1 tmp = Replace(TextLine, "TEL", "") If i = 1 Then buf = """" & Trim(tmp) & """" ElseIf InStr(tmp, "〒") > 0 Then buf = buf & "," & ReSplit(tmp) Else buf = buf & "," & """" & Trim(tmp) & """" End If '不要な空白の削除 buf = Replace(buf, " ", "", , , vbTextCompare) If i Mod 4 = 0 Then Print #outFileNo, buf buf = "" i = 0 End If End If Loop Close #inFileNo Close #outFileNo 'ファイル名の入れ替え Name myPath & FileName As myPath & "$" & FileName Name myPath & myOutFile As myPath & FileName '$付きのファイルが、バックアップとして残る End Sub Function ReSplit(ByVal strVal As String) As String Dim Matches As Object Dim Match As Object With CreateObject("VBScript.RegExp") .Pattern = "〒(\d{3}\-\d{4})(\s| )(\S+)" .Global = False Set Matches = .Execute(strVal) If Matches.Count > 0 Then strVal = Replace(strVal, "〒", "") Set Match = Matches(0).SubMatches ReSplit = """" & Match(0) & """" & "," & """" & Match(2) & """" End If End With End Function '----------------------------------------------------------------
お礼
はじめまして、お返事ありがとうございます。 私のようなもののために、お時間割いていただき感謝します・・・を超えて恐縮しております。 excelでのVBAとのことですが私、経験がありません。 明日にでも本屋で参考書探してきて解読します。 周りに聞ける人もいないし、どうにかしないといけないと一人で悶々としておりました。 なんだか光が見えた気がします。 初めての投稿なのでこのサイトの使い方もよく分かってませんが世の中、広いなと感心してしまいました。 また壁にあたった時、つまらない質問するかもしれませんがよろしくお願いします。 早々に試してみます。 ありがとうございますm(__)m
- adaypajimy
- ベストアンサー率20% (201/964)
マクロ機能のあるエディタで作業するのがよいと思います。秀丸エディタなどがつかえればよいです。 なければマクロ機能無料のものもあります。 http://www.vector.co.jp/soft/win95/writing/se198320.html マクロは…自分の操作を"記録"して"再生"する機能です。 ときわやの"と"の手前にカーソルを合わせて、自分の動作を記憶させ、一住所分のパターンが決まったら、繰り返し変換していけばいいのです。 ちなみに左に"の文字を打つ際は、カーソルを下の列にいったん下げてから、右に移動して一番左に持ってくるなど、工夫が必要です(あくまで自分の手の操作の手数だけが再生されるわけなので、文字数に依存しない操作が必要なのです)。TELの文字を削る操作も、カーソルの移動数や消去数などに注意する必要があります。 言葉では説明しずらいのですが、マクロの記憶のさせ方に工夫をすれば、今回の作業はほぼ自動化が可能だと思います。テキストを扱う際には、マクロが便利なので、どんな作業が自動化できるのか、自動化できないのか、その辺を見極められるようになって機能を扱えるようにすると、今後もなにかと便利だと思いますよ。
お礼
早々のお返事ありがとうございます。恥ずかしながらPCのスキルは低いんです。質問の時に書いておこうと思ったのですが、とりあえず質問してみようと投稿しました。 自分で本屋や知人に聞いて調べたりしてるのですが・・ やはりマクロやらVBAやらを学習したほうが良いようですね。 周りに聞ける人もいないので壁にあたってばかりです。 近道は無いですしがんばってみます。 回答を読み返しながら努力します。 またここで質問する事も多いと思います。 よろしくお願いします。 書き込みありがとうございますm(__)m
お礼
Wendy02様 補足ありがとうございます。 ちょっと時間かかると思いますがご提示頂いた方法を試みてみます。 それでも私のスキルの無さから結果が出せなかった時はまた質問させていただきます。 同じようなタイトルを見つけた時はご教授よろしくお願いいたしますm(__)m