2015-06-05 3 views
1

немного фона на моей проблеме:Завершающие запятые в конце экстракта данных в CSV

У меня есть CSV-файл, который создается с помощью запроса в MS Access. Основная часть файла CSV содержит столбцы; имена, адрес, почтовые коды, даты и т. д. Последняя строка файла содержит сводку данных; имя файла, дату, временную метку и общее количество записей. Поскольку все поля содержат строки, и мы не хотим, чтобы система усекала или пыталась оценить даты и почтовые коды, мы выводим эти поля с кавычками.

Последние две строки выглядят примерно так:

"Name","Code","Address","Address2","Office","Location","City","State","PostCode","Date" 
"FileName","DDMMYYYY","HH:MM:SS",TotalRecords,"","","","","","" 

Мне нужно удалить лишние запятые в последней строке, так это выглядит следующим образом:

"FileName","DDMMYYYY","HH:MM:SS",TotalRecords 

Я имел взгляд через и попробовал решение здесь: CSV file has extra commas

Это создает копию моего исходного файла, но оставляет все запятые нетронутыми. Это решение работает, если я удалю ВСЕ кавычки.

+0

Этот файл используется системой, не использующей мое имя, и ему не нравятся дополнительные запятые. Ручное редактирование файла является вариантом, но я надеюсь на чистое решение, которое не требует ввода человеком. – hto

+0

@teylyn Почему вы предлагаете вручную редактировать файл в stackoverflow? O__o –

+0

@ DylanHunt Да, почти два года спустя, мое предложение было бы загрузить CSV-файл в Power Query и удалить ненужные столбцы. Но кроме этого я все трачу дни, чтобы закодировать что-то, что занимает 5 минут, чтобы сделать это вручную. – teylyn

ответ

0

Если вы в Excel вы можете сделать эту одну строку в VBA:

left(Activecell.text,len(trim(replace(replace(activecell.Text,","," "),""""," ")))) 

поясню с середины из:

replace(replace(activecell.Text,","," "),""""," ") 

Заменить все запятые и двойные кавычки пробелом

trim(replace(replace(activecell.Text,","," "),""""," ")) 

Обрезать, то есть удалить начальные и конечные пробелы

len(trim(replace(replace(activecell.Text,","," "),""""," "))) 

Получить длину обрезанного текста

left(Activecell.text,len(trim(replace(replace(activecell.Text,","," "),""""," ")))) 

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

0

Если строка заканчивается с неизвестным количеством запятых или неизвестным числом:

,"" 

, например:

whatever,,,,,,,"","",,,,"","" 

Тогда этот бит VBA кода удалит этот мусор:

Sub StringCleaner() 
    Dim s1 As String, sTest As String, sOut As String 
    s1 = "," & Chr(34) & Chr(34) 
    sTest = "whatever" & ",,,,,," & s1 & s1 & ",,," & s1 & s1 
    sOut = sTest 

    While Right(sOut, 1) = "," Or Right(sOut, 3) = s1 
     If Right(sOut, 1) = "," Then sOut = Mid(sOut, 1, Len(sOut) - 1) 
     If Right(sOut, 3) = s1 Then sOut = Mid(sOut, 1, Len(sOut) - 3) 
    Wend 

MsgBox sTest & vbCrLf & sOut 
End Sub 
0

Спасибо всем за помощь.

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

Мой код ниже, любая критика для его улучшения, оценивается.

echo off 
setlocal EnableDelayedExpansion 
pause 
set cur=0 
FOR /F "delims=" %%A in (input.csv) DO (
    set line=%%A 
    set line=!line:,,=, ,! 

FOR /F "tokens=1-11 delims=," %%G in (^"!line!^") DO (
    if "%%G"=="" (echo.) 
    if "%%G"==""FILENAME"" (
     echo %%G,%%H,%%I,%%J >> test_%date:~-4,4%%date:~-7,2%%date:~-10,2%.csv 
     goto EOF 
    ) else (
     echo %%G,%%H,%%I,%%J,%%K,%%L,%%M,%%N,%%O,%%P,%%Q >> test_%date:~-4,4%%date:~-7,2%%date:~-10,2%.csv 
    ) 
    set /a cur=cur+1 
) 
) 
    :EOF 
    echo %cur% 
    pause 
Смежные вопросы