是否有人碰巧知道是否可以为特定字段将标记添加到csv中,因此Excel不会尝试将其转换为日期?
我正在尝试从应用程序写入.csv文件,并且其中一个值恰好看起来像日期,Excel会自动将其从文本转换为日期。我尝试将所有文本字段(包括看起来像日期的文本字段)放在双引号中,但这无效。
是否有人碰巧知道是否可以为特定字段将标记添加到csv中,因此Excel不会尝试将其转换为日期?
我正在尝试从应用程序写入.csv文件,并且其中一个值恰好看起来像日期,Excel会自动将其从文本转换为日期。我尝试将所有文本字段(包括看起来像日期的文本字段)放在双引号中,但这无效。
Answers:
我发现在双引号前加上'='可以实现您想要的功能。它将数据强制为文本。
例如。=“ 2008-10-03”,=“更多文字”
编辑(根据其他帖子):由于Jeffiekins指出了Excel 2007错误,因此应使用Andrew建议的解决方案:"=""2008-10-03"""
我知道这是一个老问题,但是问题不会很快消失。CSV文件很容易从大多数编程语言生成,相当小,使用纯文本编辑器在紧缩的背景下易于阅读,并且无处不在。
问题不仅在于文本字段中的日期,而且任何数字也将从文本转换为数字。有两个问题的示例:
有时可以以一个或多个零(0)开头,这些零在转换为数字时会被丢弃。或者该值包含可以与数学运算符混淆的字符(如日期:/,-)。
两种情况下,我能想到的是,“前面加上=”解决方案,如前面提到的,可能不是理想的是
如果在值的前面/后面加上一个非数字和/或非日期字符,则该值将被识别为文本,并且不会转换。非打印字符会很好,因为它不会更改显示的值。但是,普通的旧空格字符(\ s,ASCII 32)对此不起作用,因为它会被Excel截断,然后仍然转换该值。但是,还有其他各种可打印的和非打印的空格字符也可以正常工作。但是,最简单的方法是在简单制表符(\ t,ASCII 9)后面附加(添加)。
这种方法的好处:
如果由于某种原因您不想使用该选项卡,请在Unicode表中查找其他合适的内容。
可能是生成XML文件,对于某些格式,较新的MS Excel版本也可以导入该格式的文件,并且允许使用更多类似于.XLS格式的选项,但是我对此没有经验。
因此,有多种选择。根据您的要求/应用,一个可能比另一个更好。
应该说,新版本(2013+)的MS Excel不再以电子表格格式打开CSV-一个工作流中又出现了一次加速,这使得Excel的用处不大……至少,有解决此问题的说明。请参见例如以下Stackoverflow:如何在Excel 2013中正确显示.csv文件? 。
\t
分隔符后,我得到了正确的前导零;
...该死的MS Office,为什么这要花我2分钟多的时间才能弄清楚?
column_name
)。也做到了。谢谢!
'
,因为它已经被很好地理解并且不会太分散注意力……但是看不见会更好。
解决Jarod的解决方案以及Jeffiekins提出的问题后,您可以进行修改
"May 16, 2011"
至
"=""May 16, 2011"""
"
在日期之间的任何地方输入值,则此“修复”将引起问题。
"806676","None","41","=""05-16-2011""","100.00","False"
,您将看到保存并重新加载会丢失带连字符的文本。
我有一个类似的问题,这是无需编辑csv文件内容就可以帮助我的解决方法:
如果您可以灵活地使用“ .csv”以外的名称来命名文件,则可以使用“ .txt”扩展名来命名它,例如“ Myfile.txt”或“ Myfile.csv.txt”。然后,当您在Excel中打开它(不是通过拖放,而是使用“文件”->“打开”或“最近使用的文件”列表)时,Excel将为您提供“文本导入向导”。
在向导的第一页,选择“分隔”作为文件类型。
在向导的第二页中,选择“,”作为分隔符,如果值用引号引起来,则还选择文本限定符。
在第三页中,分别选择每个列,然后为每个列分配类型“文本”而不是“常规”,以防止Excel弄乱您的数据。
希望这对您或有类似问题的人有所帮助!
警告:Excel '07(至少)有一个(另一个)错误:如果字段内容中有逗号,则不会正确解析=“ field,contents”,而是将逗号后的所有内容都放入后面的字段,而不考虑引号。
我发现唯一有效的解决方法是在字段内容包含逗号时消除=。
这可能意味着有些字段无法在Excel中精确地表示“正确”,但是到目前为止,我相信没有人会感到惊讶。
field, content
包含"
,则不起作用。EG"=""field, co""ntent"""
""""
。
1"2
,如果您选择使用此技巧(而不是仅将其保留为"1""2"
文件中的样式-excel早已将其视为文本),则以Excel为目标的CSV文件中的最终正确字符串将结束被"=""1""""2"""
。
在使用C#创建要写入CSV文件的字符串时,我必须采用以下方式对其进行格式化:
"=\"" + myVariable + "\""
2018年
唯一适用于我的解决方案(并且无需修改CSV)。
Excel 2010:
Excel office365 :(客户端版本)
注意:在撰写本文时,Excel office365(网络版)将无法执行此操作。
在Excel 2010中打开一个新工作表。在“数据”功能区上,单击“从文本获取外部数据”。选择您的CSV文件,然后单击“打开”。点击下一步”。取消选中“制表符”,在“逗号”旁边放置一个复选标记,然后单击“下一步”。单击第一列上的任意位置。按住Shift键的同时拖动滑块,直到您可以单击最后一列,然后松开Shift键。单击“文本”单选按钮,然后单击“完成”
所有列都将作为文本导入,就像在CSV文件中一样。
在Microsoft Office 2016版本中仍然是一个问题,对于那些使用基因名称(例如MARC1,MARCH1,SEPT1等)的人来说,这确实令人不安。在R中生成“ .csv”文件后,我发现该解决方案最为实用,然后将其打开/与Excel用户共享:
高温超导
这是我们最初在生成csv文件时在这里使用的简单方法,它确实会稍微改变值,因此并不适合所有应用程序:
在csv中的所有值前添加一个空格
excel会将此空格从数字中剥离,例如“ 1”,“ 2.3”和“ -2.9e4”,但日期仍保留为“ 01/011993”,布尔值保留为“ TRUE”,阻止它们转换为excel的内部数据类型。
它还会阻止双引号在读入时进行换行,因此excel即使在csv中使文本保持不变的一种万无一失的方法是,如果像“ 3.1415”这样的文本用双引号引起来并在整个字符串前加一个空格,即(使用单引号表示要输入的内容)““ 3.1415””。然后在excel中,您始终拥有原始字符串,除了它用双引号引起来并在其前面加上一个空格,因此您需要在任何公式等中考虑它们。
"\xA0"
-这将起作用。
(假设Excel 2003 ...)
使用“文本到列”向导时,在步骤3中,您可以指定每个列的数据类型。单击预览中的列,然后将行为异常的列从“常规”更改为“文本”。
这是我知道如何做到这一点而又不会弄乱文件本身的唯一方法。像往常一样,使用Excel,我在桌子上数小时不停地跳动来学习这一点。
将.csv文件扩展名更改为.txt;打开文件后,这将阻止Excel自动转换文件。我的操作方法如下:打开Excel到空白工作表,关闭空白表,然后选择File => Open并选择扩展名为.txt的文件。这将迫使Excel打开“文本导入向导”,在该向导中,您将询问有关如何解释文件的问题。首先,选择定界符(逗号,制表符等),然后(这是重要部分)选择一组设置的列,然后选择格式。如果您确切想要文件中包含的内容,则选择“文本”,Excel将显示分隔符之间的内容。
awk
-避免重新格式化类似日期的值,而问题在于Excel而不是比awk
,尽管有问题标题。
对于相同的问题,我要做的就是在每个csv值之前添加以下内容:“ =”“”,并在每个CSV值之后添加一个双引号,然后再在Excel中打开文件。以以下值为例:
012345,00198475
在Excel中打开之前,应将其更改为:
"="""012345","="""00198475"
完成此操作后,每个单元格值都将在Excel中显示为公式,因此不会被格式化为数字,日期等。例如,值012345会显示为:
="012345"
1234500198475E-8
; 这样,在excel中仍然可以进行进一步的计算。
这里提供的解决方案都不是好的解决方案。它可能适用于个别情况,但前提是您要控制最终显示。以我的例子为例:我的工作产生了出售给零售的产品清单。这是CSV格式,包含零件代码,其中一些以零开头,由制造商设置(不受我们控制)。去掉前导零,您实际上可能会匹配其他产品。由于后端处理程序,零售客户希望以CSV格式列出该列表,这也是我们无法控制的,并且每个客户都不一样,因此我们无法更改CSV文件的格式。没有前缀“ =”,也没有添加标签。原始CSV文件中的数据正确无误;当客户在Excel中打开这些文件时,问题就开始了。而且许多客户并不是很精通计算机。他们几乎可以打开并保存电子邮件附件。我们正在考虑以两种略有不同的格式提供数据:一种为Excel Friendly(使用上面建议的选项,通过添加TAB,另一种为“主”格式)。但这可能是一厢情愿的想法,因为某些客户将不明白为什么我们需要这样做。与此同时,我们继续解释为什么他们有时会在电子表格中看到“错误的”数据。在Microsoft做出适当更改之前,只要没有人控制最终用户的方式,我就看不到任何适当的解决方案。使用文件。但这可能是一厢情愿的想法,因为有些客户将不明白为什么我们需要这样做。同时,我们继续解释为什么他们有时会在电子表格中看到“错误”数据。在Microsoft做出适当更改之前,只要没有人控制最终用户如何使用这些文件,我就不会对此找到合适的解决方案。但这可能是一厢情愿的想法,因为有些客户将不明白为什么我们需要这样做。同时,我们继续说明为什么他们有时会在电子表格中看到“错误”数据。在Microsoft做出适当更改之前,只要没有人控制最终用户如何使用这些文件,我就不会对此找到合适的解决方案。
"\xA0"
(非空格)来解决Excel的问题。
它不是Excel。Windows会识别公式,数据为日期并自动更正。您必须更改Windows设置。
“控制面板”(->“切换到经典视图”)->“区域和语言选项”->选项卡“区域选项”->“自定义...”->选项卡“数字”->然后更改符号根据您想要的。
http://www.pcreview.co.uk/forums/enable-disable-auto-convert-number-date-t3791902.html
它可以在您的计算机上运行,例如,如果这些设置未更改,例如在客户的计算机上,他们将看到日期而不是数据。
嗨,我有同样的问题,
我编写此vbscipt来创建另一个CSV文件。新的CSV文件的每个字段的字体都会有一个空格,因此excel会将其理解为文本。
因此,使用下面的代码(例如Modify_CSV.vbs)创建一个.vbs文件,保存并关闭它。将原始文件拖放到vbscript文件中。它将在同一位置创建一个名称为“ SPACE_ADDED”的新文件。
Set objArgs = WScript.Arguments
Set objFso = createobject("scripting.filesystemobject")
dim objTextFile
dim arrStr ' an array to hold the text content
dim sLine ' holding text to write to new file
'Looping through all dropped file
For t = 0 to objArgs.Count - 1
' Input Path
inPath = objFso.GetFile(wscript.arguments.item(t))
' OutPut Path
outPath = replace(inPath, objFso.GetFileName(inPath), left(objFso.GetFileName(inPath), InStrRev(objFso.GetFileName(inPath),".") - 1) & "_SPACE_ADDED.csv")
' Read the file
set objTextFile = objFso.OpenTextFile(inPath)
'Now Creating the file can overwrite exiting file
set aNewFile = objFso.CreateTextFile(outPath, True)
aNewFile.Close
'Open the file to appending data
set aNewFile = objFso.OpenTextFile(outPath, 8) '2=Open for writing 8 for appending
' Reading data and writing it to new file
Do while NOT objTextFile.AtEndOfStream
arrStr = split(objTextFile.ReadLine,",")
sLine = "" 'Clear previous data
For i=lbound(arrStr) to ubound(arrStr)
sLine = sLine + " " + arrStr(i) + ","
Next
'Writing data to new file
aNewFile.WriteLine left(sLine, len(sLine)-1) 'Get rid of that extra comma from the loop
Loop
'Closing new file
aNewFile.Close
Next ' This is for next file
set aNewFile=nothing
set objFso = nothing
set objArgs = nothing
我知道这是一个旧线程。对于像我这样的人,通过powershell com对象使用Office 2013仍然有此问题,可以使用opentext方法。问题在于该方法有许多参数,有时是互斥的。要解决此问题,您可以使用所介绍的调用,namedparameter方法这篇文章。一个例子是
$ex = New-Object -com "Excel.Application"
$ex.visible = $true
$csv = "path\to\your\csv.csv"
Invoke-NamedParameter ($ex.workbooks) "opentext" @{"filename"=$csv; "Semicolon"= $true}
不幸的是,我刚刚发现,当单元格包含换行符时,此方法会以某种方式中断csv解析。csv支持此功能,但是Microsoft的实现似乎有问题。同样,它也无法检测到德语特定的字符。提供正确的文化并不会改变这种行为。所有文件(csv和脚本)均以utf8编码保存。首先,我编写了以下代码,逐个插入csv单元。
$ex = New-Object -com "Excel.Application"
$ex.visible = $true;
$csv = "path\to\your\csv.csv";
$ex.workbooks.add();
$ex.activeWorkbook.activeSheet.Cells.NumberFormat = "@";
$data = import-csv $csv -encoding utf8 -delimiter ";";
$row = 1;
$data | %{ $obj = $_; $col = 1; $_.psobject.properties.Name |%{if($row -eq1){$ex.ActiveWorkbook.activeSheet.Cells.item($row,$col).Value2= $_ };$ex.ActiveWorkbook.activeSheet.Cells.item($row+1,$col).Value2 =$obj.$_; $col++ }; $row++;}
但这太慢了,这就是为什么我要寻找替代方案的原因。显然,Excel允许您使用矩阵设置一系列单元格的值。因此,我在此博客中使用了该算法来将csv转换为多数组。
function csvToExcel($csv,$delimiter){
$a = New-Object -com "Excel.Application"
$a.visible = $true
$a.workbooks.add()
$a.activeWorkbook.activeSheet.Cells.NumberFormat = "@"
$data = import-csv -delimiter $delimiter $csv;
$array = ($data |ConvertTo-MultiArray).Value
$starta = [int][char]'a' - 1
if ($array.GetLength(1) -gt 26) {
$col = [char]([int][math]::Floor($array.GetLength(1)/26) + $starta) + [char](($array.GetLength(1)%26) + $Starta)
} else {
$col = [char]($array.GetLength(1) + $starta)
}
$range = $a.activeWorkbook.activeSheet.Range("a1:"+$col+""+$array.GetLength(0))
$range.value2 = $array;
$range.Columns.AutoFit();
$range.Rows.AutoFit();
$range.Cells.HorizontalAlignment = -4131
$range.Cells.VerticalAlignment = -4160
}
function ConvertTo-MultiArray {
param(
[Parameter(Mandatory=$true, Position=1, ValueFromPipeline=$true)]
[PSObject[]]$InputObject
)
BEGIN {
$objects = @()
[ref]$array = [ref]$null
}
Process {
$objects += $InputObject
}
END {
$properties = $objects[0].psobject.properties |%{$_.name}
$array.Value = New-Object 'object[,]' ($objects.Count+1),$properties.count
# i = row and j = column
$j = 0
$properties |%{
$array.Value[0,$j] = $_.tostring()
$j++
}
$i = 1
$objects |% {
$item = $_
$j = 0
$properties | % {
if ($item.($_) -eq $null) {
$array.value[$i,$j] = ""
}
else {
$array.value[$i,$j] = $item.($_).tostring()
}
$j++
}
$i++
}
$array
}
}
csvToExcel "storage_stats.csv" ";"
您可以使用上面的代码,因为它将任何csvs转换为excel。只需将路径更改为csv和底部的定界符即可。
在我的情况下,使用R生成的csv文件中的“ Sept8”已由Excel 2013转换为“ 8-Sept”。通过使用xlsx包中的write.xlsx2()函数来生成xlsx格式的输出文件,可以解决此问题。 ,可以由Excel加载而无需进行不必要的转换。因此,如果提供了一个csv文件,则可以尝试使用write.xlsx2()函数将其加载到R中并将其转换为xlsx。
使用Google云端硬盘(如果是Mac,则为Numbers)的解决方法:
或者,如果您在Mac上执行步骤3,则可以在“数字”中打开数据。
(EXCEL 2016及更高版本,实际上我没有在旧版本中尝试过)
Mac Office 2011和Office 2013中仍然存在此问题,我无法阻止它的发生。似乎是一件很基本的事情。
以我为例,我在CSV中正确包含了诸如“ 1-2”和“ 7-12”之类的值,这些值正确地括在了逗号中间,这会自动转换为excel中的日期,如果您随后尝试将其转换为纯文本,则会得到日期的数字表示形式,例如43768。此外,它将条形码中的大数字和EAN数字重新格式化为无法转换回的123E +数字。
我发现Google云端硬盘的Google表格不会将数字转换为日期。条形码每3个字符中确实有一个逗号,但是很容易删除。它可以很好地处理CSV,特别是在处理MAC / Windows CSV时。
有时可能会救人。
我这样做是为了使信用卡号不断转换为科学计数法:我最终将.csv导入到Google表格中。导入选项现在允许禁用数值的自动格式设置。我将所有敏感列设置为“纯文本”并下载为xlsx。
这是一个糟糕的工作流程,但至少我的价值观没有改变。
我制作了这个vba宏,该宏在粘贴数字之前基本上将输出范围格式化为文本。当我想粘贴8 / 11、23 / 6、1 / 3等值而不用Excel将它们解释为日期时,它对我来说非常理想。
Sub PasteAsText()
' Created by Lars-Erik Sørbotten, 2017-09-17
Call CreateSheetBackup
Columns(ActiveCell.Column).NumberFormat = "@"
Dim DataObj As MSForms.DataObject
Set DataObj = New MSForms.DataObject
DataObj.GetFromClipboard
ActiveCell.PasteSpecial
End Sub
我非常想知道这是否也适用于其他人。我一直在寻找解决这个问题的方法,但是我没有看到快速的vba解决方案,在此之前,它不包括在输入文本前插入'。此代码以原始形式保留数据。