Импорт многострочных CSV-файлов в Excel на международном уровне - PullRequest
5 голосов
/ 14 января 2009

Существует файл .csv, который мы хотели бы распространить среди наших клиентов, он содержит многострочные записи (то есть записи с новыми строками). В зависимости от языковых настроек клиентов, файл может быть импортирован или не правильно импортирован в Excel. Обычно мы рекомендуем использовать для импорта файла, но, похоже, есть некоторые ошибки с многострочными записями, поэтому они «разбиваются» на отдельные строки (что любопытно, при непосредственном открытии файла этого не происходит).

В некоторых языках (например, в английском) CSV с запятыми открывается правильно, но не файл с точкой с запятой. С другими языками (например, немецким) можно напрямую открыть CSV с точкой с запятой, но не файл с запятыми.

Импорт не помогает с многострочными записями.

Пример файла CSV (2 строки CSV):

A; B; "some
stuff"; C;
1; 2; "another line"; 3;

Правильный импорт (2 строки с многострочным вводом):

A B (some
stuff) C
1 2 (another line) 3

Неверный импорт (3 строки):

A; B; C; "some
stuff";D;
1; 2; "another line"; 3;

Существует еще одна возможность - выбрать столбец и нажать «Текст в столбцы» в разделе «Данные». Это аккуратно разбивает строки на основе разделителя, но все равно не обходит новые строки.

Можно ли импортировать CSV-файл, чтобы многострочные записи всегда распознавались?

Ответы [ 2 ]

2 голосов
/ 01 декабря 2009

Вы, вероятно, обнаружите, что он прекрасно открывается в openoffice. Я сделал.

В этом случае вы можете сохранить его как лист исключений и разослать оба файла своим клиентам.

1 голос
/ 02 мая 2009

Ваш вопрос не совсем понятен, но я думаю, это то, что вы хотите: Примечание. По какой-то причине часть, перехватывающая ошибки, вставлена ​​неправильно. К сожалению

Public Sub ReadCSV()
'' Assumes all records:
''   Have 5 fields
''   The fields are delimited by a ;
''   The Last field ends in a ;

Dim FileName As String
Dim ExcelRow As Long
Dim WorkSheetName As String
Dim FieldValue(5) As String
Dim FieldNo As Integer
Dim StringPosition As Integer
Dim LineFromFile As String
Dim CharFromLine As String

WorkSheetName = "Sheet1"
ExcelRow = 2  '' Assumes Row 1 is a heading that you should not delete

''   Get the FileName and Open the file
If Application.FileDialog(msoFileDialogOpen).Show <> -1 Then Exit Sub
FileName = Application.FileDialog(msoFileDialogOpen).SelectedItems(1)

On Error GoTo OpenError
Open FileName For Input As #1

''   Clear old data from the workbook
sRange = WorkSheetName + "!A2:E65536"
Range(sRange).ClearContents '' Preserves formatting

''   Read The file one line at a time
On Error GoTo ReadError
While Not EOF(1)
    Line Input #1, LineFromFile
    Debug.Print LineFromFile
    FieldNo = 1
    While FieldNo <= 5  '' 5 is the number of fields in a record
        DoEvents
        FieldValue(FieldNo) = ""
        StringPosition = 1
        ''   Examine each character from the line
        While StringPosition <= Len(LineFromFile)
            CharFromLine = Mid(LineFromFile, StringPosition, 1)
            If CharFromLine = ";" Then '' ";" is the delimitor in the delimited file
                FieldNo = FieldNo + 1
                If FieldNo < 6 Then FieldValue(FieldNo) = ""
            Else
                FieldValue(FieldNo) = FieldValue(FieldNo) + CharFromLine
            End If
            ''   Test to see if we're at the end of a line, but haven't got all the fields yet
            If StringPosition = Len(LineFromFile) And FieldNo < 6 Then
                FieldValue(FieldNo) = FieldValue(FieldNo) + Chr(10) ''   Add a LineFeed to represent the new line
                Line Input #1, LineFromFile
                StringPosition = 0
            End If
            StringPosition = StringPosition + 1
        Wend
    Wend
    ''   Put the Data in the Workbook
    For FieldNo = 1 To 5
        Sheets(WorkSheetName).Cells(ExcelRow, FieldNo).Value = FieldValue(FieldNo)
    Next FieldNo
    ExcelRow = ExcelRow + 1
Wend
Exit Sub
OpenError:
    Call MsgBox("Error Opening File:" + FileName, vbCritical, "File Open Error")
    Exit Sub
ReadError:
    Call MsgBox("Error Reading File:" + FileName, vbCritical, "File Read Error")
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...