• 締切済み

テキストファイルの文字列操作

改行やカンマで区切られていないテキストファイルがあります。(「-」は半角スペースと見てください。) 11111-----aaaaaaaa--22222222--55555555-- 44444444--・・・・ といったように、スペースを含む10バイトが1つのデータとなっています。最初の10バイトのデータは必ず内5バイトがスペース、そのあとのデータは2バイトがスペースという決まりがあり、かなりのデータ量があります。 これを 11111 aaaaaaaa 22222222 55555555 44444444 というふうにスペースは除き改行したいのです。 スペースの数が一定ではないので、置換できません。VBAなどでいい方法はありますか?

みんなの回答

  • Gin_F
  • ベストアンサー率63% (286/453)
回答No.10

> やはりスペースが除かれた全てコードがExcelのA1のセルに1行で表示されただけでした。 > 11111-----aaaaaaaa--22222222--55555555-- 44444444-- 上記データの、"-" 部分を半角スペースに置換してテストしてください。 Sub テストA()   Const strInData   As String _     = "11111   aaaaaaaa 22222222 55555555 44444444 "      Dim varData   As Variant   Dim lngIdx   As Long      varData = Split(strInData, " ", , vbTextCompare)   For lngIdx = LBound(varData) To UBound(varData)     If Len(Trim(varData(lngIdx))) > 0 Then       Debug.Print Trim(varData(lngIdx))     End If   Next lngIdx    End Sub 上記コードで確認した結果、イミディエイトウィンドウに 11111 aaaaaaaa 22222222 55555555 44444444 と表示されませんか? #Acc2000で確認しました。

  • Gin_F
  • ベストアンサー率63% (286/453)
回答No.9

> インデックスが有効範囲内にありません。とエラーが表示されます > For i = 0 To 5 配列を使う場合&要素数が確定できない場合は、 LBound,UBound を使うといいですね。 imogasi さんのコードを拝借して。。 b = Split(a, " ") For i = LBound(b) To UBound(b)   Cells(j, "a") = b(i)   j = j + 1 Next i ではどうでしょうか?

jinah
質問者

補足

Gin_Fさん、エラーは出なかったんですが、やはりスペースが除かれた全てコードがExcelのA1のセルに1行で表示されただけでした。 なぜスペースが改行に変わらないのでしょう?またテキストファイルに反映はされないのでしょうか?

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.8

#7です。 >インデックスが有効範囲内にありません。とエラーが表示されます For i = 0 To 5 の後のb(i)の要素数 i が0から5が不適当であると言うエラーです。Splitした結果5(6番目)がないということです。Splitの区切り文字(2スペースで私はやりましたが、いろいろ試行して見てください。 また6項目の場合が0-5ですが、0-4にするとか してやって見てください。テストデータ・本番データのデータの有り様と関連しますので、そのデータを見ないと正確には答えられませんが。私も試行錯誤して、私のテスト データでは0-5で旨く行きました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.7

Split関数でやって見ました。必ず旨く行く自信はないが、他の方法として、下記コードの一部を細工すれば、必ずうまく行くと思う。(スペースでない文字の出現を 調べるとかすれば) (テストデータ) 11111 aaaaaaaa 22222222 55555555 44444444 11111 aaaaaaaa 22222222 55555555 44444444 11111 aaaaaaaa 22222222 55555555 44444444 11111 aaaaaaaa 22222222 55555555 44444444 同じ内容なのは手抜きしただけで意味なし。 (コード)VBAまたはVB。エクセルVBAでやった。 Sub test01() Open "c:\my documents\aa2.txt" For Input As #1 j = 1 While Not EOF(1) Line Input #1, a b = Split(a, " ") '2半角スペース For i = 0 To 5 If Mid(b(i), 1, 2) = "" Then GoTo p01 '注 ' MsgBox b(i) Cells(j, "a") = b(i) j = j + 1 p01: Next i Wend Close #1 End Sub (注)ここは=""(空白)とすべきか、=" "と1半角スペースとすべきか?私の例では=""で下記結果になった。 (結果)セルA1:A24 11111 aaaaaaaa 22222222 55555555 44444444 11111 aaaaaaaa 22222222 55555555 44444444 11111 aaaaaaaa 22222222 55555555 44444444 11111 aaaaaaaa 22222222 55555555 44444444 aaaaaaaa 22222222 55555555 44444444

jinah
質問者

補足

回答ありがとうございます。 開くファイルのパスを変更して、ExcelVBAで実行しましたが、インデックスが有効範囲内にありません。とエラーが表示されます。ExcelのA1のセルにスペースがなくなった状態のデータ全てが1行で書き出されてしまいました。 Win2000、OfficeXPを使用しています。

  • Gin_F
  • ベストアンサー率63% (286/453)
回答No.6

アプリや、バージョンが一切不明ですが。。 Split 関数で、分割してやればいいかと。 結果が配列となりますので、For Next でセルなりに書き込んでやれば いいですね。

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.5

10文字ずつよみとって、初回5文字、以降8文字だけ表示。 Cでプログラム書いたほうがてっとりばやいのですが、カテゴリが「Microsoftアプリケーション」という事で、Windows Scripting Host/JScriptで: <job><script language="JScript"> var fname = WScript.Arguments.Item(0); var fso = WScript.CreateObject( 'Scripting.FileSystemObject' ); var i = fso.OpenTextFile( fname ) var len_data = 5; while ( !i.AtEndOfStream ){ WScript.Echo( i.Read( 10 ).substr( 0, len_data ) ); len_data = 8; } </script></job>

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.4

#1のmshr1962です。すみません。訂正します。 テキストファイルでしたね。#1はエクセルの場合です。 「VBAなどで」があったので間違えました。 まあ、エクセルで開いて行えば可能とは思いますが #3の方の言われるように、別のソフトで置換した方が簡単だと思います。

  • schwarzes
  • ベストアンサー率51% (15/29)
回答No.3

正規表現が使用できるテキストエディタで、 1個以上のスペースを改行に置換すればいいと思うのですが? 自分はK2Editorを使用しています

参考URL:
http://web.kyoto-inet.or.jp/people/koyabu/
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.2

最初の区切りが5スペース、その後のすべての区切りが2スペースなんですよね? "--" → "改行" "---" → "" この2回の置換でできませんか? あるいは "--" → "改行" で1度置換した後、残った3スペースを手動で削除する方法もあります。

  • mshr1962
  • ベストアンサー率39% (7417/18945)
回答No.1

横方向なら「データ」「区切り位置」で「カンマや...」を選択して 「スペース」にチェックで A____|B_______|C_______|D_______|E_______ 11111|aaaaaaaa|22222222|55555555|44444444 の様に分解できます。 これを縦方向にする場合はコピーして、 「形式を選択して貼り付け」で「行と列を入れ替える」

関連するQ&A