Как удалить строки NUL в начале CSV; VBA

У меня есть программа, которая экспортирует спецификацию (см. пример данных в формате CSV ниже).

Я написал макрос VBA, который использует FileSystemObject для циклического просмотра выбранной пользователем папки, открытия CSV-файлов для чтения и чтения данных в память с помощью ReadAll, а затем сохранения и сортировки данных в Excel.

Проблема, с которой я столкнулся, заключается в том, что после экспорта файлов CSV я запускаю макрос, и текст в файле CSV сохраняется в моей строковой переменной (sTemp в приведенном ниже коде) в виде нескольких квадратных скобок. Я скопировал значение строковой переменной и вставил его в текстовый редактор, и оно выглядит как несколько повторяющихся черных ящиков, содержащих «SOH». Поскольку данные считываются неправильно, макрос завершается ошибкой.

Если я открою исходный CSV-файл, первые два символа будут черными прямоугольниками с надписью «NUL». NUL NUL «Шаблон», «Количество», «Размер», «Материал», «Описание», «Длина (футы)» 2041,, «3», «», «Нержавеющая сталь 316L Sch 10S PE», 20 2041,, "3", "", "Нержавеющая сталь 316L Sch 10S PE", 2.21 5044,1, "3", "Нержавеющая сталь: 304L", "DET S10 SS СТЫКОВАЯ СВАРКА", 2523,1, "3", "Нержавеющая сталь : 316L", "316L-SS-SCH10 Короткий радиус 90", 2522,1, "3", "Нержавеющая сталь: 304L", "DET S10 SS СВАРКА В СТЫК",

Если я сохраню файлы CSV в Excel, закрою их, два символа «NUL» исчезнут: «Шаблон», «Кол-во», «Размер», «Материал», «Описание», «Длина (футы)» 2041, « 3","","Нержавеющая сталь 316L Sch 10S PE",20 2041,,"3","","Нержавеющая сталь 316L Sch 10S PE",2.21 5044,1,"3","Нержавеющая сталь: 304L"," DET S10 SS СВАРКА В СТЫК", 2523,1,"3","Нержавеющая сталь: 316L","316L-SS-SCH10 Короткий радиус 90", 2522,1,"3","Нержавеющая сталь: 304L","DET S10 SS СТЫКОВАЯ СВАРКА",

После запуска макроса в сохраненных файлах строковая переменная (sTemp в приведенном ниже коде) содержит правильный текст в CSV-файле.

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

'Variables for accessing and cleaning text files
Dim oFSO As FileSystemObject 'File System Object grants access to computer files and folders
Dim sSourceFolder As String 'Path of oSourceFolder
Dim oSourceFolder 'Folder the original CSV file is stored in
Dim oFile 'The orignal CSV
Dim sFileToCopy As String 'Path of the copied CSV
Dim sTargetFolder As String 'The path of oTargetFolder
Dim oTargetFolder 'The folder the new CSV file is stored in
Dim oCopiedText 'The copied text file
Dim oCopiedFile 'The copied file itself
Dim oInput 'Represents the text in the CSV ror readin in CSV to memory
Dim sTemp As String 'For storing CSV data in memory
Dim cFiles As New Collection 'Storage for all the files in all the sub folders
Dim sPath As String 'The path of one of the files, will be reused for each file

'variables for progress
Dim iFiles As Integer
Dim Progress As Double

'Constants for reading and writing to text files
Const ForReading = 1
Const ForWriting = 2

'File System Object grants access to computer files and folders
Set oFSO = CreateObject("Scripting.FileSystemObject")

'Select the folder to get CSV files from
sSourceFolder = GetFolder("C:\", "Select Folder Containing CSV files")
Set oSourceFolder = oFSO.GetFolder(sSourceFolder) 'Tell File System Object to get a hold of oSourceFolder so you can look into it

'Check/create the _Cleaned folder inside of the source folder
On Error Resume Next
Err.Clear
sTargetFolder = oSourceFolder.Path & "\" & oSourceFolder.Name & "_Cleaned"
Set oTargetFolder = oFSO.GetFolder(sTargetFolder)
If Err.Number <> 0 Then
    'create the folder
    oTargetFolder = oFSO.CreateFolder(sTargetFolder)
End If
On Error GoTo 0

'Loop through and clean each CSV so it can be opened in excel properly
iFiles = oSourceFolder.Files.Count
Progress = 0

For Each oFile In oSourceFolder.Files 'go through each file
    Application.StatusBar = "Progress: " & Progress & " of " & CStr(iFiles) & ": " & Format(Progress / iFiles, "0%")
    If Right(oFile, 3) = "csv" Then   'if it is a text file...
        'Copy the original file path
        sFileToCopy = oFile.Path

        'Open txt file in memory
        Set oInput = oFSO.OpenTextFile(sFileToCopy, ForReading)

        'Input txt from file to memory
        sTemp = oInput.ReadAll
        'sTemp contains a repeating SOH string if I do not save the files first and the macro fails downstream
        'If I open the CSV file in excel, save it, close it, then run the macro, sTemp contains the string data in the file and the macro runs fine

'Могу ли я как-то удалить строки NUL в этот момент? . . .

Я ожидаю, что значение sTemp будет читать фактический текст в файле CSV: «Шаблон, количество, размер, материал, описание, длина (футы) 2041, 3, 316L нержавеющая сталь Sch 10S PE, 20».

Вместо этого значение sTemp в окне локалей VBA: «[[[[[[[[[[[[[[[[[[[[[[[[]» И когда я копирую значение и вставляю его в текстовый редактор он гласит: «1 СОХ СОХ СОХ СОХ СОХ СОХ»

Файлы сохраняются здесь: https://www.dropbox.com/sh/e8ohn61bxqidejd/AAB9CMno8N_EXdlA83TBX602a?dl=0.

Любая помощь приветствуется.


person Lardman363    schedule 10.02.2019    source источник
comment
Без просмотра образца исходного CSV-файла маловероятно, что кто-то сможет с этим помочь.   -  person chris neilsen    schedule 11.02.2019
comment
У меня нет учетных данных для загрузки фотографий, и я не видел, как загружать файлы. Я добавил фрагменты файлов в пост и заметил строки NUL в начале исходных файлов.   -  person Lardman363    schedule 11.02.2019
comment
Я подозреваю кодировку или формат файла, поэтому, скорее всего, подойдет только фактический файл. Упомянутые вами дополнительные символы, как правило, подтверждают это. Возможно, реальная проблема заключается в том, как генерируются файлы. Можно загрузить на файлообменник и поделиться ссылкой. К вашему сведению, никогда не рекомендуется публиковать только изображение данных (или кода)   -  person chris neilsen    schedule 11.02.2019
comment
Поищу файлообменник. Я только предлагал изображение в качестве обходного пути для моих недостающих учетных данных.   -  person Lardman363    schedule 11.02.2019
comment
Добавлены файлы в Dropbox.   -  person Lardman363    schedule 11.02.2019


Ответы (1)


У вас действительно есть файл с первыми двумя символами как ASCI 0.

Видим два основных варианта:

  1. Исправьте экспорт, создавший эти файлы, чтобы он не генерировал NULL, или
  2. Удалите ведущие символы NULL.

Для варианта 2 кажется, что ReadAll не работает, но ReadLine работает.

Демонстрация удаления NULL

Sub Demo()
    Dim oFSO As FileSystemObject
    Dim oInput As TextStream
    Dim sTemp

    Set oFSO = New FileSystemObject
    Set oInput = oFSO.OpenTextFile("Your\File.csv")
    sTemp = oInput.ReadLine
    Do While Left$(sTemp, 1) = Chr(0)
        sTemp = Mid$(sTemp, 2)
    Loop
    Do Until oInput.AtEndOfStream
        sTemp = sTemp & vbCrLf & oInput.ReadLine
    Loop
End Sub
person chris neilsen    schedule 11.02.2019
comment
Большое спасибо, я попробую и дам вам знать, как это работает. - person Lardman363; 12.02.2019
comment
Это решение превосходно! Работает отлично! Спасибо за помощь. Я понятия не имел, что это символы Chr(0) (теперь я вижу их в таблице ASCII, хотя asciitable.com). Гладко, как вы снимаете их, когда читаете строчку. Большое спасибо! - person Lardman363; 13.02.2019