我基本上想将制表符分隔的文本文件http://www.linux-usb.org/usb.ids转换为csv文件。
我尝试使用Excel导入,但它不是最佳的,结果如下:
8087 Intel Corp.
0020 Integrated Rate Matching Hub
0024 Integrated Rate Matching Hub
我希望如何轻松搜索:
8087 Intel Corp. 0020 Integrated Rate Matching Hub
8087 Intel Corp. 0024 Integrated Rate Matching Hub
我有什么方法可以在python中做到这一点吗?
答案 0 :(得分:2)
$ListDirectory = "C:\USB_List.csv"
Invoke-WebRequest 'http://www.linux-usb.org/usb.ids' -OutFile $ListDirectory
$pageContents = Get-Content $ListDirectory | Select-Object -Skip 22
"vendor`tvendor_name`tproduct`tproduct_name`r" > $ListDirectory
#Variables and Flags
$currentVid
$currentVName
$currentPid
$currentPName
$vendorDone = $TRUE
$interfaceFlag = $FALSE
$nextline
$tab = "`t"
foreach($line in $pageContents){
if($line.StartsWith("`#")){
continue
}
elseif($line.length -eq 0){
exit
}
if(!($line.StartsWith($tab)) -and ($vendorDone -eq $TRUE)){
$vendorDone = $FALSE
}
if(!($line.StartsWith($tab)) -and ($vendorDone -eq $FALSE)){
$pos = $line.IndexOf(" ")
$currentVid = $line.Substring(0, $pos)
$currentVName = $line.Substring($pos+2)
"$currentVid`t$currentVName`t`t`r" >> $ListDirectory
$vendorDone = $TRUE
}
elseif ($line.StartsWith($tab)){
if ($interfaceFlag -eq $TRUE){
$interfaceFlag = $FALSE
}
$nextline = $line.TrimStart()
if ($nextline.StartsWith($tab)){
$interfaceFlag = $TRUE
}
if ($interfaceFlag -eq $FALSE){
$pos = $nextline.IndexOf(" ")
$currentPid = $nextline.Substring(0, $pos)
$currentPName = $nextline.Substring($pos+2)
"$currentVid`t$currentVName`t$currentPid`t$currentPName`r" >> $ListDirectory
Write-Host "$currentVid`t$currentVName`t$currentPid`t$currentPName`r"
$interfaceFlag = $FALSE
}
}
}
我知道问题是针对python的,但我构建了这个PowerShell脚本来完成这项工作。它不需要参数。只需从要存储脚本的目录中以管理员身份运行即可。该脚本从http://www.linux-usb.org/usb.ids页面收集所有内容,解析数据并将其写入制表符分隔文件。然后,您可以在Excel中打开文件作为制表符分隔文件。确保列被读作" text"而不是"一般"而且你去了。 :)
解析此页面非常棘手,因为脚本必须在上下文中了解每个VID供应商行在进行一系列PID-Product行。我还强制脚本忽略注释的描述部分,interface-interface_name行,他在整个USB列表中插入的随机注释(叹息)以及" #List之后的所有内容已知的设备类,子类和协议"超出此请求的范围。
我希望这有帮助!
答案 1 :(得分:1)
你只需要编写一个程序,一次扫描一行数据。然后它应该检查第一个字符是否是标签('\ t')。如果不是,那么应该存储该值。如果它以tab开头,则打印出先前存储的值,然后打印当前行。结果将是您想要的格式的列表。
答案 2 :(得分:0)
这样的事情会起作用:
import csv
lines = []
with open("usb.ids.txt") as f:
reader = csv.reader(f, delimiter="\t")
device = ""
for line in reader:
# Ignore empty lines and comments
if len(line) == 0 or (len(line[0]) > 0 and line[0][0] == "#"):
continue
if line[0] != "":
device = line[0]
elif line[1] != "":
lines.append((device, line[1]))
print(lines)
你基本上需要遍历每一行,如果它是一个设备行,请记住以下几行。这只适用于两列,然后您需要将它们全部写入csv文件,但这很容易