人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

VBSの質問です
a.html
**************
<table>
<tr><td>1</td><td>hoge1</td></tr>
<tr><td>3</td><td>hoge3</td></tr>
<tr><td>2</td><td>hoge2</td></tr>
<tr><td>1</td><td>hoge1</td></tr>
<tr><td>2</td><td>hoge2</td></tr>
</table>
**************

b.html
**************
<table>
<tr><td>1</td><td>hoge1</td></tr>
<tr><td>1</td><td>hoge1</td></tr>
<tr><td>2</td><td>hoge2</td></tr>
<tr><td>2</td><td>hoge2</td></tr>
<tr><td>3</td><td>hoge3</td></tr>
</table>
**************
にソートしてくれるプログラムを教えて下さい

●質問者: takanii
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● cx20
●150ポイント

VBScript にて ADO というライブラリを使用したサンプルです。
HTML のテーブルを SQL のテーブルとして扱える為、ORDER BY によりソートが可能となっています。

' File : SortTable.vbs
' Usage : CScript SortTable.vbs //Nologo > b.html
Option Explicit

Dim cn
Set cn = CreateObject("ADODB.Connection")
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\a.html;Extended Properties=""HTML Import;HDR=No;"""

Dim rs
Set rs = cn.Execute("SELECT F1, F2 FROM [Table] ORDER BY F1")
Dim n
n = 0
WScript.Echo "<table>"
While Not rs.BOF And Not rs.EOF
 WScript.Echo "<tr><td>" & rs("F1") & "</td><td>" & rs("F2") & "</td></tr>"
 rs.MoveNext
Wend
WScript.Echo "</table>"

使用方法

CScript SortTable.vbs //Nologo > b.html


takaniiさんのコメント
sort.cmd にCScript SortTable.vbs //Nologo > b.html を入れ 上記スクリプトをSortTable.vbsに入れて 実行しましたところ、空のb.htmlができます

cx20さんのコメント
何か失敗しているようですね。。。 バッチファイルの最後に「PAUSE」コマンドを追加するとエラーの内容が分かるかと思います。 >|bat| CScript SortTable.vbs //Nologo > b.html PAUSE ||< エラーメッセージが >> ADODB.Connection: プロバイダーが見つかりません。正しくインストールされていない可能性があります。 << と表示されている場合、64bit OS であることが起因して失敗している可能性があります。 (OLE DB プロバイダ「Microsoft.Jet.OLEDB.4.0」は 32bit 版しか存在しない為、32bit 版のコマンドラインで実行する必要があります。) その場合、以下の手順を試してみてください。 >|| 1. エクスプローラにて「C:\Windows\SysWOW64」フォルダを開きます。 2. 「cmd.exe」を実行します。 「コマンドプロンプト」が起動します。 3. 「コマンドプロンプト」にてスクリプトのあるディレクトリに移動します。 例) C:\Windows\SySWOW64> CD C:\home\edu\hatena\takanii\1362320474 [Enter] 4. スクリプトを引数無しで実行しエラーが出ないことを確認します。 例) C:\home\edu\hatena\takanii\1362320474> CScript SortTable.vbs [Enter] 5. 再度スクリプトを引付きで実行し、b.html に結果をリダイレクトさせます。 例) C:\home\edu\hatena\takanii\1362320474> CScript SortTable.vbs //Nologo > b.html [Enter] ||<

takaniiさんのコメント
C:\Users\a\Desktop\結合\SortTable.vbs(7, 1) Microsoft JET Database Engine: エラーを特定できません と出てきます

きゃづみぃさんのコメント
C:\Users\a\Desktop\結合のフォルダにて c:\Windows\SysWOW64\cscript.exe SortTable.vbs で 画面表示されます。

cx20さんのコメント
よく分からないエラーですね。。。 Data Source = ? の箇所を「フルパス」に変えてもメッセージは同じでしょうか? >|vb| cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\a.html;Extended Properties=""HTML Import;HDR=No;""" ||< ↓ >|vb| cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\a\Desktop\結合\a.html;Extended Properties=""HTML Import;HDR=No;""" ||<

takaniiさんのコメント
SysWOW64にはmsjet40.dllは入っているんですが・・

cx20さんのコメント
Jet データベースエンジンがうまく機能していないようですね。。。 Jet の上位版である、ACE データベースエンジンでは如何でしょうか。コンポーネントは以下 URL よりダウンロード可能です。 >> ■ Download: Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント - Microsoft Download Center - Download Details http://www.microsoft.com/ja-jp/download/details.aspx?id=13255 << ソースコードの変更箇所は「Microsoft.Jet.OLEDB.4.0」→「Microsoft.ACE.OLEDB.12.0」になります。 >|vb| cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\a\Desktop\結合\a.html;Extended Properties=""HTML Import;HDR=No;""" ||< ↓ >|vb| cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\a\Desktop\結合\a.html;Extended Properties=""HTML Import;HDR=No;""" ||<

cx20さんのコメント
>> Microsoft JET Database Engine: エラーを特定できません << と表示されるケースですが、環境変数の TMP または TEMP に存在しないフォルダが定義してる場合に、表示されるケースがあるようです。 >> ■ [PRB] Jet 使用時に "ディスクまたはネットワークのエラー" または "特定できないエラー" が発生する http://support.microsoft.com/kb/251254/ja << 念のため、コマンドプロンプトで、以下のコマンドを実行し、表示されたパスが存在するか、ご確認頂けないでしょうか。 (自分の PC 環境で、TMP / TEMP 環境変数を存在しないパスに変更し、同じエラーが出ることを確認しました。) >|| C:\> ECHO %TMP% [Enter] C:\> ECHO %TEMP% [Enter] ||<

2 ● きゃづみぃ
●150ポイント
Dim objFile  ' 対象ファイル
Dim objFile2 ' 出力ファイル
Dim objFSO ' ファイルシステムオブジェクト
Dim k
Dim tb()
Dim tb2()

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("a.html")
k=0
Do Until objFile.AtEndOfLine = True
strText = objFile.ReadLine
if instr(strText,"<tr>") > 0 then
k=k+1
redim Preserve tb(k)
redim Preserve tb2(k)
tb2(k)=strText
a=instr(strText,"<td>")
b=instr(strText,"</td>")
tb(k)=mid(strText,a+4,b-9)
end if
Loop
objFile.Close

for a=1 to k
for b=a to k
if tb(a)>tb(b) then
c=tb(a)
tb(a)=tb(b)
tb(b)=c
d=tb2(a)
tb2(a)=tb2(b)
tb2(b)=d
end if
next
next

Set objFile2 = objFSO.CreateTextFile("b.html")
objFile2.WriteLine("<table>")
for a=1 to k
objFile2.WriteLine ( tb2(a) )
next
objFile2.WriteLine("</table>")

objFile2.Close


takaniiさんのコメント
hoge1の列でソートするにはどこを変更すればいいのでしょうか?

きゃづみぃさんのコメント
>|vb| Dim objFile ' 対象ファイル Dim objFile2 ' 出力ファイル Dim objFSO ' ファイルシステムオブジェクト Dim k Dim tb() Dim tb2() Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.OpenTextFile("a.html") k=0 Do Until objFile.AtEndOfLine = True strText = objFile.ReadLine if instr(strText,"<tr>") > 0 then k=k+1 redim Preserve tb(k) redim Preserve tb2(k) tb2(k)=strText a=instr(strText,"</td><td>") b=instr(a+1,strText,"</td>") tb(k)=mid(strText,a+9,b-19) end if Loop objFile.Close for a=1 to k for b=a to k if tb(a)>tb(b) then c=tb(a) tb(a)=tb(b) tb(b)=c d=tb2(a) tb2(a)=tb2(b) tb2(b)=d end if next next Set objFile2 = objFSO.CreateTextFile("b.html") objFile2.WriteLine("<table>") for a=1 to k objFile2.WriteLine ( tb2(a) ) next objFile2.WriteLine("</table>") objFile2.Close ||<

きゃづみぃさんのコメント
>|vb| a=instr(strText,"<td>") b=instr(strText,"</td>") tb(k)=mid(strText,a+4,b-9) の三行を a=instr(strText,"</td><td>") b=instr(a+1,strText,"</td>") tb(k)=mid(strText,a+9,b-19) に変更しました。 ||<
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ