删除CSV文件中的重复数据

时间:2019-04-09 12:34:49

标签: vbscript

我实际上是在编写脚本以删除12'000行的CSV文件中的重复项。我知道此文件在userid和/或card_number上具有重复项,其格式如下:

userid, fistname, lastname, card_number
=======================================
1234, toto, help, 111111
1234, toto, help, 111111

AND

1234, toto, help, 111111
5678, user, user2, 111111

我想逐行阅读这些行,然后将它们添加到字典对象中(如果它们已经存在的话),然后将剩余的行写到另一个文件中,并将字典导出到日志文件中。

使用fso对象创建/打开/写入/保存文件的编码功能正在起作用。

我无法恢复似乎无效的字典方法。

我对如何导出词典一无所知,或者可能仅仅是因为词典无法正常工作。

我已经对stackoverflow,ssh64或Expert-exchange进行了大量研究以找到解决方案,但是我被阻止了,我想我的脚本就差不多了,但是任何帮助都将不胜感激。

```
`
`This is the dictionary part to record duplicates 
`in a file and remove them from the destination file
`
```
`
`# Declares required variables
Dim objFSO, objFolder, objShell, objTextFile, objFile
Dim strDirectory, CurDir, InputFile, OutputFile 
Dim strInput, strFile
Dim dictionary, it

`# Here we go !
Set objFSO = Createobject("Scripting.FileSystemobject") 
Set OutputFile = objFSO.CreateTextFile(CurDir & ".\myCSVfile.csv", 2, true)
Set objFile = objFSO.OpenTextFile(CurDir & InputFile, 1)

`# Reads the file until the end
Do Until objFile.AtEndOfStream

    strInput = objFile.ReadLine()
    strInput = Trim(strInput)
    If Len(strInput) > 0 Then
        'WScript.Echo strInput
        'OutputLog.Writeline strInput
        'Quit
    End If

    `# Test if it already exists, if YES, it's a duplicate
    If Not dictionary.exists(strInput) Then
        OutputFile.Writeline strInput
    Else
        dictionary.add strInput, null
        If dictionary.Count >= 0 Then
            objTextFile.Write dictionary.items
        Else
            objTextFile.Write "There are " & dictionary.Count & "  duplicated data in the file."
        End If
    End if

Loop

`# Populate the log file with the duplicated entries
For Each it In dictionary
    .Item  = it & "" & dictionary(it)
    objTextFile.Writeline .Item
Next

预期结果: -要填充重复项的字典 -要复制的日志文件 -要从最终文件中删除重复项

实际结果: -打开输入文件 -读取输入文件 -创建输出文件 -写入输出文件 -打开日志文件 -写入日志文件

1 个答案:

答案 0 :(得分:0)

每个字典值都需要一个键,因此,如果将输入中的每一行都当作一个键,并为该值复制它,这是使其工作的一种非常简单的方法。设置清理代码比处理代码本身更多。顺便说一句,如果您想变得更复杂,则可以传入数组作为字典值。并遍历字典和数组的值,但看起来好像只是想比较行。

dict.Add "Key", Split(line, ",")

我使用了您的示例,6个中的4个应该是唯一的:

Option Explicit

Dim fso : set fso = CreateObject("Scripting.FileSystemObject")
Dim fileIn : set fileIn = fso.OpenTextFile("c:\users\user\desktop\input.txt")
Dim fileOut : set fileOut = fso.OpenTextFile("c:\users\user\desktop\output.txt", 2, true) ' for writing/create
Dim dictlog : set dictlog = fso.OpenTextFile("c:\users\user\desktop\dictlog.txt", 2, true) ' for writing/create
Dim dict : set dict = CreateObject("Scripting.Dictionary")
Dim key
dim line

Do Until fileIn.AtEndOfStream
    key = fileIn.ReadLine
    line = key

    if Not dict.exists(key) Then
        dict.Add key, line      
        fileOut.WriteLine line
    else
        dictLog.WriteLine line
    end if
Loop

fileIn.Close
fileOut.Close
dictlog.Close

Set fso     = Nothing
Set fileIn  = Nothing
Set fileOut = Nothing
Set line    = Nothing
Set dict    = Nothing
set dictlog = Nothing