Можно ли открыть файл CSv / Txt с запятой и точкой с запятой (точка с запятой в качестве разделителя) непосредственно в Excel и сохранить его без искажений? - PullRequest
0 голосов
/ 15 февраля 2019

Это со ссылкой на мой ответ на SO сообщение макрос разделяет .csv запятой, несмотря на то, что разделитель установлен на точку с запятой и последующее сообщение Сохранение .txt как .csv отменяет все изменения, сделанные макросом вфайл.Как это предотвратить? от @Drzemlik.Что вначале считалось простым решением какого-то уже отрицательного поста с голосованием, в процессе подготовки ответа было обнаружено, что проблема может стоить награды?

В моей пробной версии я обнаружил, что при сохранении файлов txt / csv, разделенных точкой с запятой, из Excel может появиться несколько двойных кавычек в сохраненном файле (в зависимости от положения запятой, пробела, двойной кавычки и точки с запятой в строке).Может ссылаться на ссылки Сохранение файла Excel в формате .txt без кавычек и link1 и link2 .

Однако я совсем не удовлетворен моим обходным подходом: открыть файл Csv / Txt с оператором Open в режиме ввода-вывода и переименовать его.Тем не менее, я считаю, что я что-то упустил, и должен быть простой и прямой подход , чтобы открыть и сохранить файл только в Excel.

  1. Текстовый файл должен состоять из запятой, пробелов, двойных кавычек и точек с запятой, а точка с запятой должна рассматриваться как разделитель.

  2. ФайлЧтобы открыть его непосредственно в Excel с помощью «OpenText or TextToColumns» или аналогичным образом, выполнить некоторую простую операцию усечения столбца (скажем, столбец 2) и сохранить его непосредственно из Excel.

  3. Задача может быть выполнена максимально просто.Наиболее предпочтительно с использованием некоторых параметров / настроек OpenText и / или saveAs, которые я пропустил.Процесс должен быть свободен от типа Find replace для манипулирования содержимым файла и введенных двойных кавычек.

  4. Наконец, самое сложное - открыть файл с расширением .csv и напрямую сохранить его с расширением .csv с благодарностью.

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

Ln,1  "AND" Col,1;  Ln,1  "AND" Col,2;  Ln,1  "AND" Col,3;  Ln,1  "AND" Col,4;  Ln,1  "AND" Col,5;  Ln,1  "AND" Col,6;  Ln,1  "AND" Col,7;  Ln,1  "AND" Col,8;
Ln,2  "AND" Col,1;  Ln,2  "AND" Col,2;  Ln,2  "AND" Col,3;  Ln,2  "AND" Col,4;  Ln,2  "AND" Col,5;  Ln,2  "AND" Col,6;  Ln,2  "AND" Col,7;  Ln,2  "AND" Col,8;
Ln,3  "AND" Col,1;  Ln,3  "AND" Col,2;  Ln,3  "AND" Col,3;  Ln,3  "AND" Col,4;  Ln,3  "AND" Col,5;  Ln,3  "AND" Col,6;  Ln,3  "AND" Col,7;  Ln,3  "AND" Col,8;
Ln,4  "AND" Col,1;  Ln,4  "AND" Col,2;  Ln,4  "AND" Col,3;  Ln,4  "AND" Col,4;  Ln,4  "AND" Col,5;  Ln,4  "AND" Col,6;  Ln,4  "AND" Col,7;  Ln,4  "AND" Col,8;
Ln,5  "AND" Col,1;  Ln,5  "AND" Col,2;  Ln,5  "AND" Col,3;  Ln,5  "AND" Col,4;  Ln,5  "AND" Col,5;  Ln,5  "AND" Col,6;  Ln,5  "AND" Col,7;  Ln,5  "AND" Col,8;
Ln,6  "AND" Col,1;  Ln,6  "AND" Col,2;  Ln,6  "AND" Col,3;  Ln,6  "AND" Col,4;  Ln,6  "AND" Col,5;  Ln,6  "AND" Col,6;  Ln,6  "AND" Col,7;  Ln,6  "AND" Col,8;
Ln,7  "AND" Col,1;  Ln,7  "AND" Col,2;  Ln,7  "AND" Col,3;  Ln,7  "AND" Col,4;  Ln,7  "AND" Col,5;  Ln,7  "AND" Col,6;  Ln,7  "AND" Col,7;  Ln,7  "AND" Col,8;
Ln,8  "AND" Col,1;  Ln,8  "AND" Col,2;  Ln,8  "AND" Col,3;  Ln,8  "AND" Col,4;  Ln,8  "AND" Col,5;  Ln,8  "AND" Col,6;  Ln,8  "AND" Col,7;  Ln,8  "AND" Col,8;
Ln,9  "AND" Col,1;  Ln,9  "AND" Col,2;  Ln,9  "AND" Col,3;  Ln,9  "AND" Col,4;  Ln,9  "AND" Col,5;  Ln,9  "AND" Col,6;  Ln,9  "AND" Col,7;  Ln,9  "AND" Col,8;
Ln,10  "AND" Col,1; Ln,10  "AND" Col,2; Ln,10  "AND" Col,3; Ln,10  "AND" Col,4; Ln,10  "AND" Col,5; Ln,10  "AND" Col,6; Ln,10  "AND" Col,7; Ln,10  "AND" Col,8;
Ln,11  "AND" Col,1; Ln,11  "AND" Col,2; Ln,11  "AND" Col,3; Ln,11  "AND" Col,4; Ln,11  "AND" Col,5; Ln,11  "AND" Col,6; Ln,11  "AND" Col,7; Ln,11  "AND" Col,8;
Ln,12  "AND" Col,1; Ln,12  "AND" Col,2; Ln,12  "AND" Col,3; Ln,12  "AND" Col,4; Ln,12  "AND" Col,5; Ln,12  "AND" Col,6; Ln,12  "AND" Col,7; Ln,12  "AND" Col,8;
Ln,13  "AND" Col,1; Ln,13  "AND" Col,2; Ln,13  "AND" Col,3; Ln,13  "AND" Col,4; Ln,13  "AND" Col,5; Ln,13  "AND" Col,6; Ln,13  "AND" Col,7; Ln,13  "AND" Col,8;
Ln,14  "AND" Col,1; Ln,14  "AND" Col,2; Ln,14  "AND" Col,3; Ln,14  "AND" Col,4; Ln,14  "AND" Col,5; Ln,14  "AND" Col,6; Ln,14  "AND" Col,7; Ln,14  "AND" Col,8;

Ответы [ 3 ]

0 голосов
/ 03 марта 2019

Давайте начнем с определения

Требования:
1. Чтобы открыть текстовый файл непосредственно в Excel, используя точку с запятой в качестве разделителя.
2. Выполняет усечениедля всех значений в столбце 2.
3. Сохраняет результирующие данные с расширением csv, сохраняя при этом исходный макет (например, данные ячеек, разделенные точками с запятой вместо запятых, их значения, не заключенные в двойные кавычки, и любые существующие двойныекавычки в ячейках не должны дублироваться) вместо стандартного формата csv, сгенерированного Excel.

При таком подходе добавляется новая рабочая книга, затем импортируется файл CSV с использованием соединения QueryTable, выполняется усечение значений.во втором столбце и сохраняет файл в формате xlTextPrinter, присваивая имя файлу с расширением csv, затем закрывает книгу, использованную для изменения исходного файла.После этого открывает файл результатов в блокноте для проверки макета вывода.

Редактировать: Это «Ближайший обходной путь» , как рассматривается в Op.

Sub TEST()
Dim sFilenameSrc As String, sFilenameTrg As String
sFilenameSrc = "D:\@D_Trash\@Csv_Source.csv"    'change as required
sFilenameTrg = "D:\@D_Trash\@Csv_Target.csv"    'change as required

    Call Open_Csv_As_Semicolon_Delimited_Then_Save_As_Csv(sFilenameSrc, sFilenameTrg)

    Rem Open Target with Notepad
    Shell "notepad.exe " & sFilenameTrg, vbNormalFocus

    End Sub


Sub Open_Csv_As_Semicolon_Delimited_Then_Save_As_Csv(sFilenameSrc As String, sFilenameTrg As String)
Dim wb As Workbook
Dim rg As Range, aData As Variant
Dim aValue As Variant, lRow As Long

    Rem Add Workbook
    Set wb = Workbooks.Add(Template:="Workbook")

    Rem Import Csv File
    With wb.Worksheets(1)
        Rem Set qt = .QueryTables.Add(Connection:="TEXT;" & sFilenameSrc, Destination:=.Cells(1))
        With .QueryTables.Add(Connection:="TEXT;" & sFilenameSrc, Destination:=.Cells(1))
            .SaveData = True
            .TextFileParseType = xlDelimited
            .TextFileSemicolonDelimiter = True
            .TextFileTrailingMinusNumbers = True
            .Refresh BackgroundQuery:=False
    End With: End With

    Rem Set Data Range
    Set rg = wb.Worksheets(1).UsedRange

    Rem Truncate 2nd Column
    aData = rg.Columns(2).Value2
    For lRow = 1 To UBound(aData)
        aValue = aData(lRow, 1)
        aValue = Left(aValue, InStrRev(aValue, Chr(34)))
        aData(lRow, 1) = aValue
    Next
    rg.Columns(2).Value2 = aData

    Rem Prepare Data for Save as Csv
    aData = rg.Value2
    rg.ClearContents
    For lRow = 1 To UBound(aData)
        aValue = WorksheetFunction.Index(aData, lRow, 0)
        aValue = Join(aValue, Chr(59)) & Chr(59)
        rg.Cells(lRow, 1).Value2 = aValue
    Next

    rem Save File with csv extension     
    Application.DisplayAlerts = False
    With wb
        .SaveAs Filename:=sFilenameTrg, FileFormat:=xlTextPrinter
        .Close
    End With
    Application.DisplayAlerts = True

    End Sub
0 голосов
/ 04 марта 2019

Если нет необходимости в решении на основе VBA / Macro, отличается ли приведенное ниже от того, что вы ожидаете,

  1. Откройте новую книгу
  2. На вкладке «Данные»> в группе «Получить внешние данные»> нажмите кнопку «Из текста».

    GetExternalData-FromText

  3. Выберитетребуемый входной файл.

  4. В диалоговом окне «Мастер импорта текста»,

    Шаг 1: выберите «С разделителями» и нажмите «Далее»

    Шаг 2:Отметьте только «Точка с запятой»

    semicolondelimit

    Шаг 3: Никаких изменений не требуется, нажмите «Готово»

    Нажмите «ОК»

Вы должны хорошо сохранить полученный файл в формате "csv".

Cheers!

0 голосов
/ 01 марта 2019

Это мой самый короткий подход (ни с Find / Replace, ни с двойными кавычками), протестированный на вашем среднем CSV-примере на пустом новом ActiveSheet.
Вторая часть может не соответствовать вашему намеченному подходу, тем не менее, довольно коротка:

Public Sub DealingMeanCSVexample()
    With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & _
       Application.DefaultFilePath & "\Source.csv", Destination:=Range("$A$1"))
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileSemicolonDelimiter = True
        .Refresh
        .Delete
    End With

    Dim r As Long, s As String
    For r = 1 To ActiveSheet.UsedRange.Rows.Count
        s = s & WorksheetFunction.TextJoin(";", True, ActiveSheet.UsedRange.Rows(r)) & ";" & vbCrLf
    Next r
    s = Left(s, Len(s) - 2)

    Dim handle As Long: handle = FreeFile
    Open Application.DefaultFilePath & "\Dest.csv" For Binary As #handle
    Put #handle, , s
    Close #handle
End Sub

Поскольку TextJoin является частью более новых версий Excel, цикл можно заменить следующим образом:

Dim r as long, Dim c As Long
For r = 1 To ActiveSheet.UsedRange.Rows.Count
    For c = 1 To ActiveSheet.UsedRange.Columns.Count
        s = s & ActiveSheet.Cells(r, c).Value & ";"
    Next c
    s = s & vbCrLf
Next r
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...