2017-01-15 7 views
0

Мой сценарий выполняет итерацию по большому количеству данных в файле .xlsx и, в зависимости от того, существует или нет файл, создает/открывает файл в отношении набора данных, в котором он сейчас работает.Создает ли CreateTextFile условие гонки над OpenTextFile?

код, который обрабатывается определения того, следует ли FileSystemObject создать/открыть текстовый файл в конечном итоге вызывает часть данных, которые будут повторяться в начале текста файла. После изменения работы с одним файлом не было повторений, означающих, что логика, которая обрабатывает извлечение данных, прекрасна.

Set excel = CreateObject("Excel.Application") 
Set excelWorkbook = excel.Workbooks.Open("C:\data.xlsx") 
Set excelSheet = excelWorkbook.Worksheets(1) 
Set fso = CreateObject("Scripting.FileSystemObject") 

id = "" 
sum = 0 
row = 2 

Do While row < 40500 
    'identifier located in column c 
    id = excelSheet.Range("C" & row).value 

    'followed by numbers in column h 
    'column h is empty on the row of an id 
    Do While Len(excelSheet.Range("H" & row+1).value) > 0 
     sum = excelSheet.Range("H" & row+1).value + sum 
     row = row + 1 
    Loop 

    WriteToText id,row,sum 
    sum = 0 
    row = row + 1 
Loop 

Sub WriteToText(x, y, z) 
    fileName = "C:\file" & x & ".txt" 
    If fso.FileExists(fileName) Then 
     Set file = fso.OpenTextFile(fileName, 8) 
     file.WriteLine x & " " & y " " & z 
     file.Close 
    Else 
     Set file = fso.CreateTextFile(fileName) 
     file.WriteLine x & " " & y " " & z 
     file.Close 
    End If 
End Sub 

Является ли это результатом не освобождая пространство памяти, как только создается текстовый файл, обрабатывается, и закрывается?

Set file = Nothing 

... в результате чего буфер, созданный с CreateTextFile сохраняться через память раз OpenTextFile называется?

+0

О чем говорит '! Eof'? Это даже допустимый синтаксис? – Lankymart

+0

Это псевдокод. Мне не приходило в голову, что это недействительный синтаксис в vbscript, поскольку я в основном работаю на C/C++. Вы можете предположить, что у меня есть правильное условие, которое определяет, когда оно достигнет конца данных. –

+0

Если вы хотите предоставить псевдокод, пожалуйста, укажите его в вопросе, в идеале, чтобы помочь вам решить проблему, нам понадобится [mcve], акцент на «полный». Как @ ansgar-wiechers [упоминания] (http://stackoverflow.com/a/41663176/692942) - * «Не видя, откуда берутся ваши данные, и как вы его тянете, не сообщается, откуда могут появляться дубликаты данных». Мы не можем сделать это с неполными примерами. – Lankymart

ответ

2

Не зная, откуда берутся ваши данные, и как вы его тянете, нет информации о том, откуда могут возникнуть дублирующие данные. Я не вижу в своем коде неотъемлемого состояния гонки, поскольку VBScript не является многопоточным в первую очередь. Тем не менее, вы можете избежать любых проблем, связанных с различием, независимо от того, существует ли файл уже с помощью метода OpenTextFile с третьим параметром, установленным на True. Это автоматически создаст отсутствующий файл и в противном случае добавит его.

Sub WriteToText(x, y, z) 
    fileName = "C:\file" & x & ".txt" 
    fso.OpenTextFile(fileName, 8, True).WriteLine x & " " & y " " & z 
End Sub 

Установка объектов в Nothing внутри функций almost never required, поскольку VBScript обычно обрабатывает, что автоматически сами по себе.

+0

Я не согласен. Я видел несколько раз, особенно со сложными сценариями, чтобы вы правильно выпускали память. Ключевым примером является соединение с базой данных, если оно объявлено глобально, удерживая их в течение срока действия скрипта, не рекомендуется. Но многие из них сводятся к структуре вашего кода, используемым областям и т. Д. – Lankymart

+3

@ Lankymart [Родственные] (https://blogs.msdn.microsoft.com/ericlippert/2004/04/28/when-are -вы-обязательно к посаженным-объектам-к-ничего /). –

+0

Я знаю эту статью и абсолютно согласен с тем, что говорит Эрик, но она по-прежнему зависит от области действия, и не весь код правильно охвачен. Например, страница ASP с соединением с БД ... Я видел это снова и снова, когда соединение открывается в начале и открыто до конца, когда это не нужно, даже создавая дополнительные подключения для обработки других задач во время выполнение страницы, когда на самом деле требуется только одно соединение и только при извлечении данных. – Lankymart

Смежные вопросы