【问题标题】:VBS to sort lines of a text fileVBS对文本文件的行进行排序
【发布时间】:2018-02-07 16:59:26
【问题描述】:

我正在寻找一种对文本文件的行进行排序的好方法,我不知道最好的方法是否是使用数组。这是我的文件:

大众;蓝色;20000;链接 大众;蓝色;21000;链接 大众;蓝色;29000;链接 大众;蓝色;28000;链接 大众;蓝色;22000;链接 大众;红色;20000;链接 大众;红色;28000;链接 大众;红色;30000;链接 大众;红色;21000;链接 大众;红色;26000;链接 奔驰;蓝色;30000;链接 奔驰;蓝色;38000;链接 奔驰;蓝色;40000;链接 奔驰;蓝色;31000;链接 奔驰;蓝色;37000;链接 奔驰;红色;40000;链接 奔驰;红色;40000;链接 奔驰;红色;47000;链接 奔驰;红色;41000;链接 奔驰;红色;44000;链接

我需要重新整理一个档案,对每个品牌的汽车进行分类,蓝色的价格较高,红色的价格较低。 (只有这两种颜色)。我正在寻找的结果如下:

大众;蓝色;29000;链接 大众;蓝色;28000;链接 大众;蓝色;22000;链接 大众;蓝色;21000;链接 大众;蓝色;20000;链接 大众;红色;20000;链接 大众;红色;21000;链接 大众;红色;26000;链接 大众;红色;28000;链接 大众;红色;30000;链接 奔驰;蓝色;40000;链接 奔驰;蓝色;38000;链接 奔驰;蓝色;37000;链接 奔驰;蓝色;31000;链接 奔驰;蓝色;30000;链接 奔驰;红色;40000;链接 奔驰;红色;40000;链接 奔驰;红色;41000;链接 奔驰;红色;44000;链接

有什么想法吗?

【问题讨论】:

  • 是的,这很容易做到,将所有内容读入一个锯齿状数组,根据您的喜好将其循环到另一个锯齿状数组中,然后输出
  • 您可以尝试使用断开连接的 ADODB 记录集进行排序。无论如何,您需要在排序之前拆分每个字符串以提取关键字段。
  • 好的,谢谢你的帮助,明天试试
  • stackoverflow.com/questions/29552725/… 这是一个带有选项的通用排序例程。与下面的答案使用 ADO 读取文件不同,这里您读取文件并使用 ADO 在内存中创建数据库。
  • 必须用VBScript解决吗?这将是与 JScript 在公园散步?

标签: sorting vbscript


【解决方案1】:

应使用数据库工具(ADO、ODBC、Schema.ini、SQL、IIF)解决数据库问题。如本演示 (64 Bit, Access driver):

Option Explicit

Const adClipString = 2

Dim oFS : Set oFS = CreateObject("Scripting.FileSystemObject")
WScript.Echo oFS.OpenTextFile("schema.ini").ReadAll()
WScript.Echo "--------------------------"
Dim oDb : Set oDb = CreateObject("ADODB.Connection")
Dim sCS : sCS = Join(Array( _
                    "Driver=Microsoft Access Text Driver (*.txt, *.csv)" _
                  , "Dbq=" & oFS.GetAbsolutePathName(".") _
                  , "Extensions=asc,csv,tab,txt" _
                ), ";")
WScript.Echo sCS
WScript.Echo "--------------------------"
oDb.Open sCS
Dim sSQL 
For Each sSQL In Array( _
                    "SELECT * FROM [48669323.csv]" _
                  , "SELECT * FROM [48669323.csv] ORDER BY Brand, Color, Price" _
                  , "SELECT * FROM [48669323.csv] ORDER BY Brand, Color, IIF(Color='red', Price * -1, Price)" _
                 )
    WScript.Echo sSQL
    WScript.Echo "--------------------------"
    WScript.Echo oDb.Execute(sSQL).GetString(adClipString, , ",", vbCrLf, "<NULL>")
    WScript.Echo "--------------------------"
Next
oDb.Close    

输出:

cscript 48669323.vbs
[48669323.csv]
Format=Delimited(;)
ColNameHeader=False
Col1=Brand Text
Col2=Color Text
Col3=Price Long
Col4=WTF Text

--------------------------
Driver=Microsoft Access Text Driver (*.txt, *.csv);Dbq=C:\Users\eh\tmp;Extensions=asc,csv,tab,txt
--------------------------
SELECT * FROM [48669323.csv]
--------------------------
VW,blue,20000,link
VW,blue,21000,link
VW,blue,29000,link
VW,blue,28000,link
VW,blue,22000,link
VW,red,20000,link
VW,red,28000,link
VW,red,30000,link
VW,red,21000,link
VW,red,26000,link
MERCEDES,blue,30000,link
MERCEDES,blue,38000,link
MERCEDES,blue,40000,link
MERCEDES,blue,31000,link
MERCEDES,blue,37000,link
MERCEDES,red,40000,link
MERCEDES,red,40000,link
MERCEDES,red,47000,link
MERCEDES,red,41000,link
MERCEDES,red,44000,link

--------------------------
SELECT * FROM [48669323.csv] ORDER BY Brand, Color, Price
--------------------------
MERCEDES,blue,30000,link
MERCEDES,blue,31000,link
MERCEDES,blue,37000,link
MERCEDES,blue,38000,link
MERCEDES,blue,40000,link
MERCEDES,red,40000,link
MERCEDES,red,40000,link
MERCEDES,red,41000,link
MERCEDES,red,44000,link
MERCEDES,red,47000,link
VW,blue,20000,link
VW,blue,21000,link
VW,blue,22000,link
VW,blue,28000,link
VW,blue,29000,link
VW,red,20000,link
VW,red,21000,link
VW,red,26000,link
VW,red,28000,link
VW,red,30000,link

--------------------------
SELECT * FROM [48669323.csv] ORDER BY Brand, Color, IIF(Color='red', Price * -1, Price)
--------------------------
MERCEDES,blue,30000,link
MERCEDES,blue,31000,link
MERCEDES,blue,37000,link
MERCEDES,blue,38000,link
MERCEDES,blue,40000,link
MERCEDES,red,47000,link
MERCEDES,red,44000,link
MERCEDES,red,41000,link
MERCEDES,red,40000,link
MERCEDES,red,40000,link
VW,blue,20000,link
VW,blue,21000,link
VW,blue,22000,link
VW,blue,28000,link
VW,blue,29000,link
VW,red,30000,link
VW,red,28000,link
VW,red,26000,link
VW,red,21000,link
VW,red,20000,link

--------------------------

另请参阅:ABC

【讨论】:

  • 这很有趣,我尝试安装“Microsoft Access Database Engine x64”时出现错误,提示我必须卸载 Office x86。因此,我尝试安装“Microsoft Access Database Engine x86”,但出现错误提示我必须卸载 Office x64。让我们试试旧版本。
  • 我可以安装“Microsoft Access Database Engine x64” 2010 版
  • 太棒了,我的 7400 行文件排序需要 0.5 秒!非常感谢 Ekkehard.Horner!
猜你喜欢
  • 2011-10-15
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
  • 2022-01-10
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多