VBSの質問です

a.html
******************
<table>
<tr>
<td>1</td>
<td>2</td>
<td>hoge1</td>
<td>hoge1</td>
</tr>
<tr>
<td>1</td>
<td>1</td>
<td>hoge1</td>
<td>hoge1</td>
</tr>
<tr>
<td>3</td>
<td>1</td>
<td>hoge3</td>
<td>hoge1</td>
</tr>
<tr>
<td>2</td>
<td>2</td>
<td>hoge2</td>
<td>hoge1</td>
</tr>
<tr>
<td>3</td>
<td>2</td>
<td>hoge3</td>
<td>hoge1</td>
</tr>
<tr>
<td>2</td>
<td>3</td>
<td>hoge2</td>
<td>hoge1</td>
</tr>
</table>
******************
というファイルがあるのですが、
これを
b.html
******************
<table>
<tr>
<td>1</td>
<td>1</td>
<td>hoge1</td>
<td>hoge1</td>
</tr>
<tr>
<td>1</td>
<td>2</td>
<td>hoge1</td>
<td>hoge1</td>
</tr>
<tr>
<td>2</td>
<td>2</td>
<td>hoge2</td>
<td>hoge1</td>
</tr>
<tr>
<td>2</td>
<td>3</td>
<td>hoge2</td>
<td>hoge1</td>
</tr>
<tr>
<td>3</td>
<td>1</td>
<td>hoge3</td>
<td>hoge1</td>
</tr>
<tr>
<td>3</td>
<td>2</td>
<td>hoge3</td>
<td>hoge1</td>
</tr>
</table>
******************
に変換するスクリプトを教えて下さい
一番左の列を第一優先 左から二番目の列を第二優先でソートをお願いします

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/03/05 19:47:54
  • 終了:2013/03/12 19:50:04

ベストアンサー

id:taknt No.1

きゃづみぃ回答回数13481ベストアンサー獲得回数11982013/03/05 22:21:49

ポイント150pt
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
strText = objFile.ReadLine
strText = objFile.ReadLine
Do Until objFile.AtEndOfLine = True
	strText1 = objFile.ReadLine
	strText2 = objFile.ReadLine
	strText3 = objFile.ReadLine
	strText4 = objFile.ReadLine
	strText = objFile.ReadLine
	strText = objFile.ReadLine
	k=k+1
	redim Preserve tb(k)
	redim Preserve tb2(k)
	tb2(k)=strText
	a=instr(strText1,"<td>")
	b=instr(strText1,"</td>")
	c= mid(strText1,a+4,b-5)
	tb(k)= c * 10000
	a=instr(strText2,"<td>")
	b=instr(strText2,"</td>")
	c= mid(strText2,a+4,b-5)
	tb(k)= tb(k) + c
	tb2(k) = "<tr>" & vbcrlf & strText1 & vbcrlf & strText2 & vbcrlf
	tb2(k) = tb2(k) & strText3 & vbcrlf & strText4 & vbcrlf & "</tr>"
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

その他の回答(1件)

id:taknt No.1

きゃづみぃ回答回数13481ベストアンサー獲得回数11982013/03/05 22:21:49ここでベストアンサー

ポイント150pt
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
strText = objFile.ReadLine
strText = objFile.ReadLine
Do Until objFile.AtEndOfLine = True
	strText1 = objFile.ReadLine
	strText2 = objFile.ReadLine
	strText3 = objFile.ReadLine
	strText4 = objFile.ReadLine
	strText = objFile.ReadLine
	strText = objFile.ReadLine
	k=k+1
	redim Preserve tb(k)
	redim Preserve tb2(k)
	tb2(k)=strText
	a=instr(strText1,"<td>")
	b=instr(strText1,"</td>")
	c= mid(strText1,a+4,b-5)
	tb(k)= c * 10000
	a=instr(strText2,"<td>")
	b=instr(strText2,"</td>")
	c= mid(strText2,a+4,b-5)
	tb(k)= tb(k) + c
	tb2(k) = "<tr>" & vbcrlf & strText1 & vbcrlf & strText2 & vbcrlf
	tb2(k) = tb2(k) & strText3 & vbcrlf & strText4 & vbcrlf & "</tr>"
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

id:cx20 No.2

cx20回答回数603ベストアンサー獲得回数1072013/03/06 00:39:18

ポイント150pt

http://q.hatena.ne.jp/1362320474 と殆ど同じサンプルとなりますが、
ADO + Jet/ACE Database Engine + ISAM ドライバ(テキストドライバ)を用いることで、HTML のテーブルを SQL のテーブルとして操作できるようになります。

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

Dim cn
Set cn = CreateObject("ADODB.Connection")
' Jet データベースエンジンを使用した場合の接続文字列
cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\a.html;Extended Properties=""HTML Import;HDR=No;"""
' ACE データベースエンジンを使用した場合の接続文字列
'cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=.\a.html;Extended Properties=""HTML Import;HDR=No;"""

Dim rs
' 列1、列2の順にソートする
Set rs = cn.Execute("SELECT * FROM [Table] ORDER BY F1, F2")

Dim strRow
Dim strData
Dim fld

WScript.Echo "<table>"
While Not rs.BOF And Not rs.EOF
    strRow = "<tr>" & vbCrLf
    For Each fld In rs.Fields
        strData = "<td>" & fld.Value & "</td>" & vbCrLf
        strRow = strRow & strData
    Next
    strRow = strRow & "</tr>"
    WScript.Echo strRow
    rs.MoveNext
Wend
WScript.Echo "</table>"

上記の ADO の接続文字列は、以下のような構成を表しています。

<ADO 概要>
[アプリケーション]
   |
  [ADO]         … ADODB.Connection
   |
  [OLE DB]
   |
[OLE DB Provider] … Microsoft.Jet.OLEDB.4.0 もしくは
   |             Microsoft.ACE.OLEDB.12.0
 [ISAM ドライバ] … Extended Properties="HTML Import;HDR=No;"
   |
 [HTML ファイル]  … Data Source=.\a.html

「HDR=No」を指定した場合は、F1, F2, ... のように自動的に列名が付与されます。
ソートする場合は、この列名を使用して、

SELECT * FROM [Table] ORDER BY F1, F2

と、することで、ソートすることが可能です。

F1F2F3F4
12hoge1hoge1
11hoge1hoge1
31hoge3hoge1
22hoge2hoge1
32hoge3hoge1
23hoge2hoge1

以下は、ソートした結果になります。

F1F2F3F4
11hoge1hoge1
12hoge1hoge1
22hoge2hoge1
23hoge2hoge1
31hoge3hoge1
32hoge3hoge1

実行方法。以下は、対象ディレクトリを「C:\home\edu\hatena\takanii\136248047」とした場合のコマンド例です。

1. エクスプローラにて「C:\Windows\SysWOW64」フォルダを開きます。

2. 「cmd.exe」を実行します。
  「コマンドプロンプト」が起動します。

3. 「コマンドプロンプト」にてスクリプトのあるディレクトリに移動します。
例)
C:\Windows\SySWOW64> CD C:\home\edu\hatena\takanii\136248047 [Enter]

4. スクリプトを引数無しで実行しエラーが出ないことを確認します。
例)
C:\home\edu\hatena\takanii\136248047> CScript SortTable.vbs [Enter]
→ エラーなく、画面に結果が表示されれば、成功です。

5. 再度スクリプトを引数付きで実行し、b.html に結果をリダイレクトさせます。
例)
C:\home\edu\hatena\takanii\136248047> CScript SortTable.vbs //Nologo > b.html [Enter]

Jet データベースエンジンでも動作する想定ですが、うまくいかない場合は、
ACE データベースエンジンを試してみてください。
ACE データベースエンジンは以下よりダウンロード可能となっています。

■ Download: Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント - Microsoft Download Center - Download Details
http://www.microsoft.com/ja-jp/download/details.aspx?id=13255

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません