Удалить дубликаты данных в файле CSV - PullRequest
0 голосов
/ 09 апреля 2019

На самом деле я пишу скрипт для удаления дубликатов в CSV-файле из 12 000 строк. Я знаю, что в этом файле есть дубликаты идентификатора пользователя И / ИЛИ номера_карты, его формат:

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

И

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

Я хотел бы прочитать строки по одной и добавить их в объект словаря, если они уже есть, затем записать в другом файле оставшиеся строки и экспортировать словарь в файл журнала.

Работают закодированные функции для создания / открытия / записи / сохранения файлов с использованием объектов fso.

Я не могу вернуться к словарному методу, который, кажется, не работает.

Я понятия не имею, как экспортировать свой словарь, или, может быть, это только из-за того, что словарь не работает.

Я провел много исследований по stackoverflow, ssh64 или обмену экспертами, чтобы найти решения, но я заблокирован, я полагаю, что я почти там со своим сценарием, но любая помощь будет очень признательна.

```
`
`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 голосов
/ 09 апреля 2019

Каждое значение словаря требует ключа, поэтому, если вы обрабатываете каждую строку ввода как ключ и дублируете его для значения, это очень простой способ заставить его работать. В настройке очистки больше кода, чем в самом коде обработки. Кстати, вы можете передать Array в качестве значения словаря, если хотите усовершенствовать. и зациклите словарь и значение массива, но выглядело так, как будто вы просто хотите сравнить строки.

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

Я использовал ваши примеры, и 4 из 6 должны быть уникальными:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...