Игнорировать новые строки в значении CSV - PullRequest
2 голосов
/ 06 марта 2010

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

Данные выглядят так:

"filename.txt","hey there
buddy
how are you
doing"
"filename2.txt","and so on..."

В соответствии с http://creativyst.com/Doc/Articles/CSV/CSV01.htm#EmbedBRs, мой импортер CSV должен читать эти значения разрыва строки как отдельные значения, а не как новые строки.Тем не менее, я пробовал OO Calc, KSpread, Gnumeric и даже Microsoft Excel 2007, и никто из них не читал так;все они считают каждую новую строку новой строкой.

Кто-нибудь знает, как это исправить?Я просмотрел другие связанные вопросы, но ни один из них, похоже, не сказал.

Если это не сработает, мне придется написать файл напрямую с помощью модуля Python Excel-Writing или чего-то еще.Кто-нибудь знает, что здесь делать?

Ответы [ 8 ]

2 голосов
/ 25 января 2013

Файл должен иметь расширение .csv. Кажется, не работает иначе. Ошибка в Excel, насколько я понимаю.

1 голос
/ 03 августа 2011

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

Я бы предложил один из них:

  • использовать другой формат: например, таблицу XML или HTML можно импортировать в Excel напрямую

  • экранирование строк в файлах и разделение их в Excel, используя функцию Excel (или VBasic)

Я считаю, что использование CSV является разумным вариантом, только если у вас есть предсказуемые и простые данные в простой форме, чтобы вы могли соблюдать правило «одна строка = одна строка». (И тогда вы можете сделать всю работу с printf, что просто круто.: D)

1 голос
/ 17 сентября 2010

Мне пришлось переключиться на что-то, что делало ввод / вывод в формате Excel, я не получал Excel для синтаксического анализа новых строк из CSV.

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

1 голос
/ 06 марта 2010

Excel 2007 будет читать их нормально, но вы все равно будете иметь возврат каретки в столбце.

Вам нужно будет удалить их перед импортом файла.

Если вы создаетесамостоятельно подать заявку с SQL Server, вы можете легко удалить их.

REPLACE(REPLACE(Field, CHAR(13),' '), CHAR(10), ' ') AS FixedField
1 голос
/ 06 марта 2010

Бесплатное LumenWorks CSV reader обрабатывает новые строки в данных, если вы установите соответствующий флаг.

0 голосов
/ 03 сентября 2017

Спасибо, Алекс П! Это дает мне лучший способ экспортировать текст из Scrivener в Excel. Вот мой вариант сценария VBA для вас:

    Sub importScriv()

Dim recFields As Variant
Dim rec, rec2 As String
Dim index, row, col, numcols
Dim FileName

FileName = ThisWorkbook.Path & "/scriv.txt"

Open FileName For Input As #1
Line Input #1, rec
' Get next line
Line Input #1, rec2
row = 1

While Not EOF(1)
    ' The Scrivner compile needs to put a % + Tab character as the first thing in the Section Layout Prefix
    ' The % is used to demark Scrivener documents
    Do While Left(rec2, 1) <> "%"
        rec = rec & rec2 & Chr(13)
        ' Get next line
        Line Input #1, rec2
        If EOF(1) Then GoTo Finish
    Loop

    ' Split the lines at the tab seprators
    recFields = Split(rec, vbTab)
    numcols = UBound(recFields) - LBound(recFields) + 1

    ' put the data in the row
    For col = 1 To numcols
        ' Remove any leading carriage returns
        If Left(recFields(col - 1), 1) = CHR(13) Then
          recFields(col - 1) = Right(recFields(col - 1), Len(recFields(col - 1)) - 1)
        End If
        Cells(row, col) = recFields(col - 1)
    Next col

    ' We got a % in rec2 so set rec to rec2
    rec = rec2

    ' increment the row
    row = row + 1
    ' Get next line
    Line Input #1, rec2
Wend

Finish: Close #1

' Finally, delete the first column that contains the % document separator characters
Columns(1).EntireColumn.Delete

End Sub
0 голосов
/ 07 июля 2013

Если ваш CSV-файл содержит многострочные поля в кавычках, то есть только chr(10) (0x0A), чтобы сделать разрыв (что, по-видимому, используется по умолчанию для экспортированных CSV-файлов Excel 2007), а не chr(13)+chr(10), тогда стандартная обработка файла VBA отлично работает, используя line input #1 и split. В результате вы получаете один элемент динамического массива поля с новой строкой внутри него.

Пример для файла csv, в котором могут быть новые строки в поле 3 (4):

dim recFields as variant
dim rec as string
open "testfile.csv" for input as #1
line input #1, rec
while not eof(1)
    recFields = split(rec,vbTab)
    recFields(3) = replace(recFields(3),chr(10),"|")
    ' May want to remove quotes as well
    recFields(3) = replace(recFields(3),chr(34),"")
    ' Do some stuff here.
    ' Then read next record
    line input #1,rec
wend
close #1

Ключ имеет строки, представленные в поле как 0x0A, а не 0x0C+0x0A, и использует динамический (вариантный) массив для разделения записи. Я боялся справиться с этой ситуацией, пока не понял, что под старым добрым VBA это работает. Страшная альтернатива чтения вперед, затем назад (например, с использованием PHP ftell и fseek) была исключена!

0 голосов
/ 06 марта 2010

Укажите кавычку (") в качестве квалификатора текста при импорте. В этом случае символы новой строки будут игнорироваться.

...