- 締切済み
テキストファイルの文字列操作
改行やカンマで区切られていないテキストファイルがあります。(「-」は半角スペースと見てください。) 11111-----aaaaaaaa--22222222--55555555-- 44444444--・・・・ といったように、スペースを含む10バイトが1つのデータとなっています。最初の10バイトのデータは必ず内5バイトがスペース、そのあとのデータは2バイトがスペースという決まりがあり、かなりのデータ量があります。 これを 11111 aaaaaaaa 22222222 55555555 44444444 というふうにスペースは除き改行したいのです。 スペースの数が一定ではないので、置換できません。VBAなどでいい方法はありますか?
- みんなの回答 (10)
- 専門家の回答
みんなの回答
- Gin_F
- ベストアンサー率63% (286/453)
> やはりスペースが除かれた全てコードが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)
> インデックスが有効範囲内にありません。とエラーが表示されます > 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 ではどうでしょうか?
- imogasi
- ベストアンサー率27% (4737/17069)
#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)
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
補足
回答ありがとうございます。 開くファイルのパスを変更して、ExcelVBAで実行しましたが、インデックスが有効範囲内にありません。とエラーが表示されます。ExcelのA1のセルにスペースがなくなった状態のデータ全てが1行で書き出されてしまいました。 Win2000、OfficeXPを使用しています。
- Gin_F
- ベストアンサー率63% (286/453)
アプリや、バージョンが一切不明ですが。。 Split 関数で、分割してやればいいかと。 結果が配列となりますので、For Next でセルなりに書き込んでやれば いいですね。
- osamuy
- ベストアンサー率42% (1231/2878)
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)
#1のmshr1962です。すみません。訂正します。 テキストファイルでしたね。#1はエクセルの場合です。 「VBAなどで」があったので間違えました。 まあ、エクセルで開いて行えば可能とは思いますが #3の方の言われるように、別のソフトで置換した方が簡単だと思います。
- schwarzes
- ベストアンサー率51% (15/29)
正規表現が使用できるテキストエディタで、 1個以上のスペースを改行に置換すればいいと思うのですが? 自分はK2Editorを使用しています
- UKY
- ベストアンサー率50% (604/1207)
最初の区切りが5スペース、その後のすべての区切りが2スペースなんですよね? "--" → "改行" "---" → "" この2回の置換でできませんか? あるいは "--" → "改行" で1度置換した後、残った3スペースを手動で削除する方法もあります。
- mshr1962
- ベストアンサー率39% (7417/18945)
横方向なら「データ」「区切り位置」で「カンマや...」を選択して 「スペース」にチェックで A____|B_______|C_______|D_______|E_______ 11111|aaaaaaaa|22222222|55555555|44444444 の様に分解できます。 これを縦方向にする場合はコピーして、 「形式を選択して貼り付け」で「行と列を入れ替える」
補足
Gin_Fさん、エラーは出なかったんですが、やはりスペースが除かれた全てコードがExcelのA1のセルに1行で表示されただけでした。 なぜスペースが改行に変わらないのでしょう?またテキストファイルに反映はされないのでしょうか?