忽略CSV值中的换行符

时间:2010-03-05 21:18:56

标签: csv newline

所以我有一个包含文件名和文件内容的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编写模块或其他东西直接编写文件。谁知道该怎么做?

8 个答案:

答案 0 :(得分:2)

该文件必须具有.csv扩展名。似乎没有其他工作。就我而言,Excel中的错误。

答案 1 :(得分:1)

如果您设置了适当的标记,则免费的LumenWorks CSV reader会处理数据中的换行符。

答案 2 :(得分:1)

Excel 2007会很好地读取它们,但您仍然会在列中返回回车。

在导入文件之前,您需要将其删除。

如果您自己从SQL Server创建文件,则可以轻松删除它们。

REPLACE(REPLACE(Field, CHAR(13),' '), CHAR(10), ' ') AS FixedField

答案 3 :(得分:1)

我不得不切换到直接执行Excel格式I / O的操作,我没有按照预期从Excel中解析新行。

即便如此,它也没有最终解决问题,因为Excel具有每单元格难以控制的字符数。客户决定不再继续这样做,并与他们需要Excel文件的软件的开发人员一起制定了备用提交流程。

答案 4 :(得分:1)

好吧,如果输入文件可能包含任何内容,它也可能包含引号,逗号等等任何会破坏整个表格的内容。

我建议其中一个:

  • 使用不同的格式:例如,XML或HTML表格可以直接导入Excel

  • 转义文件中的换行符并使用Excel函数(或VBasic)将它们拆分为Excel

我相信只有当您以简单的形式拥有可预测且简单的数据时,使用CSV才是合理的选择,因此您可以将规则保持为“一行=一行”。 (然后你可以用printf完成所有工作,这很酷。:D)

答案 5 :(得分:0)

导入时将quote(“)指定为文本限定符。然后将忽略换行符。

答案 6 :(得分:0)

如果您的.csv文件引用了仅有chr(10) (0x0A)的多行字段来执行中断(这似乎是Excel 2007导出的.csv文件的默认值),而不是chr(13)+chr(10),那么使用line input #1split,标准VBA文件处理工作正常。结果是你得到了一个字段的动态数组元素,其中包含了换行符。

在字段3(4)中可能包含换行符的csv文件示例:

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的ftellfseek)避免!

答案 7 :(得分:0)

谢谢Alex P!这为我提供了一种更好的方法,可以将从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