所以我有一个包含文件名和文件内容的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编写模块或其他东西直接编写文件。谁知道该怎么做?
答案 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 #1
和split
,标准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的ftell
和fseek
)避免!
答案 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