有没有人碰巧知道我是否可以为某个字段添加到我的csv中的令牌,以便Excel不会尝试将其转换为日期?
我正在尝试从我的应用程序中编写.csv文件,其中一个值看起来就像Excel自动将其从文本转换为日期的日期。我已经尝试将所有文本字段(包括看起来像日期的字段)放在双引号内,但这没有效果。
答案 0 :(得分:333)
我发现在双引号之前加上'='可以达到你想要的效果。它强制数据为文本。
例如。 =“2008-10-03”,=“更多文字”
编辑(根据其他帖子):因为Excel 2007 bug noted by Jeffiekins应该使用solution proposed by Andrew:"=""2008-10-03"""
答案 1 :(得分:133)
我知道这是一个老问题,但问题不会很快消失。 CSV文件很容易从大多数编程语言中生成,相当小,人们可以在简单的文本编辑器中使用,并且无处不在。
问题不仅在于文本字段中的日期,而且任何数字也会从文本转换为数字。这是一个有问题的例子:
有时可以以一个或多个零(0)开头,这些零在转换为数字时会被丢弃。或者该值包含可能与数学运算符混淆的字符(如日期:/, - )。
我可以想到两个案例,如前所述,“prepending =”解决方案可能不太理想
如果一个pre /在数值中附加非数字和/或非日期字符,则该值将被识别为文本而不进行转换。非打印字符会很好,因为它不会改变显示的值。但是,普通旧空格字符(\ s,ASCII 32)对此不起作用,因为它被Excel切掉,然后值仍然被转换。 但还有各种其他打印和非打印空间字符可以正常工作。 最简单的是追加(添加)简单制表符(\ t,\ t \ t,ASCII 9)。
这种方法的好处:
如果您不想使用该选项卡,请在Unicode表中查找其他合适的选项。
可能是生成XML文件,其中某些格式也被新的MS Excel版本接受导入,并且允许更多类似.XLS格式的选项,但我没有这方面的经验。 / p>
所以有各种选择。根据您的要求/应用程序,可能会比另一个更好。
需要说明的是,MS Excel的新版本(2013+)不再以电子表格格式打开CSV - 在一个工作流程中再增加一个speedbump,使得Excel不那么有用......至少,存在获取的说明周围。参见例如此Stackoverflow:How to correctly display .csv files within Excel 2013? 。
答案 2 :(得分:98)
使用Jarod的解决方案和Jeffiekins提出的问题,您可以修改
"May 16, 2011"
到
"=""May 16, 2011"""
答案 3 :(得分:59)
我遇到了类似的问题,这是帮助我而不必编辑csv文件内容的解决方法:
如果您可以灵活地将文件命名为“.csv”以外的其他名称,则可以使用“.txt”扩展名来命名,例如“Myfile.txt”或“Myfile.csv.txt”。然后当您在Excel中打开它时(不是通过拖放,而是使用文件 - >打开或最近使用的文件列表),Excel将为您提供“文本导入向导”。
在向导的第一页中,为文件类型选择“Delimited”。
在向导的第二页中,选择“,”作为分隔符,如果用引号括起值,也选择文本限定符
在第三页中,分别选择每一列,并为每个列分配“文本”而不是“常规”,以防止Excel弄乱您的数据。
希望这可以帮助您或有类似问题的人!
答案 4 :(得分:27)
警告:Excel '07(至少)有一个(另一个)错误:如果字段内容中有逗号,则它不会正确解析=“字段,内容”,而是将所有内容放在逗号进入以下字段,不管引号如何。
我发现唯一的解决方法是在字段内容包含逗号时消除=。
这可能意味着有些字段无法在Excel中完全“正确”表示,但是现在我相信没有人会感到太惊讶。
答案 5 :(得分:19)
在C#中创建要写入我的CSV文件的字符串时,我必须这样格式化:
"=\"" + myVariable + "\""
答案 6 :(得分:15)
在Excel 2010中打开一个新工作表。 在“数据”功能区上,单击“从文本获取外部数据”。 选择您的CSV文件,然后单击“打开”。 点击下一步”。 取消选中“Tab”,在“逗号”旁边放置一个复选标记,然后单击“下一步”。 单击第一列的任意位置。 按住shift键的同时拖动滑块直到您可以单击最后一列,然后释放shift键。 单击“文本”单选按钮,然后单击“完成”
所有列都将作为文本导入,就像它们在CSV文件中一样。
答案 7 :(得分:12)
Microsoft Office 2016版本中仍然存在一个问题,对于我们这些使用基因名称的人来说相当令人不安,例如MARC1,MARCH1,SEPT1等。 我在R中生成“.csv”文件后发现最实用的解决方案,然后将与Excel用户打开/共享:
HTH
答案 8 :(得分:9)
这是我们在首先生成csv文件时使用的简单方法,它确实更改了一些值,因此它不适合所有应用程序:
在csv
中的所有值前加一个空格此空间将被excel从诸如“1”,“2.3”和“-2.9e4”之类的数字中删除,但将保留在“01/10/1993”之类的日期和“TRUE”之类的布尔值,停止它们被转换为excel的内部数据类型。
它还会在读入时停止双引号,因此在csv中制作文本的一种万无一失的方法仍然保持不变,即使是“3.1415”之类的文本是用双引号括起来并在前面加上整个字符串一个空格,即(使用单引号显示您要键入的内容)'“3.1415”'。然后在excel中你总是有原始字符串,除了它被双引号括起来并以空格为前缀,所以你需要考虑任何公式中的那些等。
答案 9 :(得分:8)
这是我知道如何在不弄乱文件内部的情况下实现此目的的唯一方法。像往常一样,我通过在桌面上敲打几个小时来学习这一点。
将.csv文件扩展名更改为.txt;这将阻止Excel在文件打开时自动转换文件。我是这样做的:打开Excel到空白工作表,关闭空白工作表,然后File =>打开并选择扩展名为.txt的文件。这会强制Excel打开“文本导入向导”,它会询问您有关如何解释文件的问题。首先,您选择分隔符(逗号,制表符等),然后(这是重要的部分)您选择一组列并选择格式。如果你想要文件中的确切内容然后选择“文本”,Excel将显示分隔符之间的内容。
答案 10 :(得分:8)
(假设Excel 2003 ...)
使用“文本到列”向导时,在步骤3中,您可以指定每个列的数据类型。单击预览中的列,将行为不当列从“常规”更改为“文本”。
答案 11 :(得分:5)
2018
唯一适用于我的解决方案(也是无需修改CSV )。
Excel 2010:
Excel office365:(客户端版本)
注意:Excel office365(网络版),在撰写本文时,您将无法执行。
答案 12 :(得分:4)
(EXCEL 2007及更高版本)
<强>或者:强>
Data > Get external data > From Text
选择您的CSV。无论哪种方式,您都会看到导入选项,只需选择包含日期的每一列,并告诉excel格式为&#34; text&#34;不是&#34;一般&#34;。
答案 13 :(得分:4)
这里提供的解决方案都不是一个好的解决方案。它可能适用于个别情况,但仅限于您控制最终显示。举个例子:我的作品产生了他们卖给零售的产品清单。这是CSV格式,包含部分代码,其中一些以零开头,由制造商设置(不在我们的控制之下)。拿走前导零,你可能实际上匹配另一个产品。 零售客户需要CSV格式的列表,因为后端处理程序也是我们无法控制的,每个客户也不同,因此我们无法更改CSV文件的格式。没有带前缀的&#39; =&#39;,也没有添加标签。原始CSV文件中的数据是正确的;当客户在Excel中打开这些文件时,问题就开始了。许多客户并不是真正精通计算机的人。他们可以打开并保存电子邮件附件。 我们正在考虑以两种稍微不同的格式提供数据:一种是Excel Friendly(使用上面建议的选项添加一个TAB,另一种作为&#39; master&#39;。但这可能是一厢情愿的想法客户不会理解为什么我们需要这样做。同时我们会继续解释为什么他们有时会在电子表格中看到错误的数据。 在Microsoft进行适当更改之前,我认为没有适当的解决方案,只要无法控制最终用户如何使用这些文件。
答案 14 :(得分:3)
我为同样的问题所做的是在每个csv值之前添加以下内容: &#34; =&#34;&#34;&#34; 在Excel中打开文件之前,每个CSV值后有一个双引号。以下列值为例:
012345,00198475
在Excel中打开之前应更改这些内容:
"="""012345","="""00198475"
执行此操作后,每个单元格值在Excel中显示为公式,因此不会被格式化为数字,日期等。例如,值012345显示为:
="012345"
答案 15 :(得分:2)
嗨,我有同样的问题,
我写这个vbscipt来创建另一个CSV文件。新的CSV文件将在每个字段的字体中有一个空格,因此excel会将其理解为文本。
因此,您使用下面的代码创建.vbs文件(例如Modify_CSV.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
答案 16 :(得分:2)
它不是Excel。 Windows确实将公式,数据识别为日期并自动更正。您必须更改Windows设置。
&#34;控制面板&#34; ( - &gt;&#34;切换到经典视图&#34;) - &gt; &#34;区域和语言 选项&#34; - &GT;选项卡&#34;区域选项&#34; - &GT; &#34;自定义...&#34; - &GT;标签&#34;数字&#34; - &GT;和 然后根据你想要的改变符号。
http://www.pcreview.co.uk/forums/enable-disable-auto-convert-number-date-t3791902.html
它可以在您的计算机上运行,如果这些设置没有更改,例如您的客户&#39;电脑他们会看到日期而不是数据。
答案 17 :(得分:2)
如果不修改csv文件,您可以:
excel将正确格式化并将您的csv单元格分隔为文本格式,忽略自动日期格式。
有点愚蠢的解决方法,但在导入之前它会改变csv数据。安迪贝尔德和理查德对这种方法没有提及,但错过了几个重要的步骤。
答案 18 :(得分:2)
本周我遇到了这个约会,这似乎是一个很好的方法,但我无法在任何地方找到它。有人熟悉吗?你能举出一个消息来源吗?我没有看过几个小时,但我希望有人会认识到这种方法。
示例1:=(“012345678905”)显示为 012345678905
示例2:=(“1954-12-12”)显示为 1954-12-12 ,而不是 12/12/1954 。
答案 19 :(得分:1)
使用Google云端硬盘的解决方法(如果您使用的是Mac,则使用Numbers):
或者,如果您在Mac上执行第3步,则可以打开Numbers中的数据。
答案 20 :(得分:1)
我知道这是一个老线程。对于像我这样的人,使用office 2013通过powershell com对象仍然有这个问题可以使用opentext method。问题是这个方法有很多参数,有时是互斥的。要解决此问题,您可以使用this post中引入的invoke-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支持这一点,但微软实现似乎有问题。 它也以某种方式检测不到德国特定的字符。赋予它正确的文化并没有改变这种行为。所有文件(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允许您使用矩阵设置一系列单元格的值。所以我使用this blog中的算法来转换多个阵列中的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的路径和底部的分隔符。
答案 21 :(得分:1)
在我的情况下,使用R生成的csv文件中的“Sept8”被Excel 2013转换为“8-Sept”。通过在xlsx包中使用write.xlsx2()函数生成输出文件解决了该问题采用xlsx格式,可以通过Excel加载而无需进行不必要的转换。因此,如果给你一个csv文件,你可以尝试将它加载到R中并使用write.xlsx2()函数将其转换为xlsx。
答案 22 :(得分:1)
(EXCEL 2016及更高版本,实际上我没有在旧版本中尝试过)
答案 23 :(得分:0)
如果您准备更改原始源 CSV 文件,另一种选择是更改数据中的“分隔符”,因此如果您的数据是“4/11”(或 4-11)并且 Excel 会将其转换为4/11/2021(英国或 11-4-2021 美国),然后将“/”或“-”字符更改为其他字符将阻止不需要的 Excel 日期转换。选项可能包括:
注意:如果要在其他地方使用该文件,则移至 Unicode 或其他非 ascii/ansi 字符可能会使问题复杂化。
因此,'4-11' 转换为带有波浪号的 '4~11' 不会被视为日期!
对于大型 CSV 文件,这没有额外的开销(即:额外的引号/空格/制表符/公式结构)并且仅在直接打开文件时有效(即:双击 CSV 以打开)并避免预先将列格式化为文本或将 CSV 文件“导入”为文本。
如有必要,记事本(或类似工具)中的搜索/替换可以轻松地与备用分隔符相互转换。
在较新版本的 Excel 中,您可以导入数据(在其他答案中概述)。 在旧版本的 Excel 中,您可以安装“Power Query”加载项。此工具还可以在不转换的情况下导入 CSV。选择:Power Query 选项卡/来自文件/来自文本-CSV,然后“加载”以作为表格打开。 (您可以从“数据类型检测”选项中选择“不检测数据类型”)。
答案 24 :(得分:0)
我制作了这个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解决方案,之前没有包括插入'在输入文本前面。此代码以原始格式保留数据。
答案 25 :(得分:0)
我这样做的信用卡号码不断转换为科学记数法:我最终将我的.csv导入Google表格。导入选项现在允许禁用数值的自动格式化。我将任何敏感列设置为纯文本并下载为xlsx。
这是一个糟糕的工作流程,但至少我的价值观应该保持原样。
答案 26 :(得分:0)
如果有人还在寻找答案,下面这行很适合我
我输入了=("my_value")
。
即 =("04SEP2009")
显示为 04SEP2009
而不是 09/04/2009
同样适用于超过 15 位的整数。他们不再修剪了。
答案 27 :(得分:0)
将表格粘贴到单词中。进行搜索/替换并将所有 - (破折号)更改为 - (双击)。复制并粘贴到Excel中。可以对其他符号(/)等执行相同操作。如果需要在Excel中更改回一次破折号,只需将列格式化为文本,然后进行更改。希望这会有所帮助。
答案 28 :(得分:0)
最轻松的解决方案 我今天才想到这一点。
完成编辑后,您可以再次在Word中重新打开它,再次使用连字符替换连字符。
答案 29 :(得分:0)
此问题在Mac Office 2011和Office 2013中仍然存在,我无法阻止它发生。这似乎是一件基本的事情。
在我的情况下,我有“1 - 2”等值。 CSV中的“7 - 12”在引号中正确包含,这会自动转换为excel中的日期,如果您尝试将其转换为纯文本,您将获得日期的数字表示,例如43768.此外,它重新格式化为大在条形码和EAN编号中找到的数字再次为123E +数字,无法转换回来。
我发现Google云端硬盘的Google表格并未将这些数字转换为日期。条形码每3个字符中都有逗号,但这些字符很容易删除。它非常适合处理CSV,特别是在处理MAC / Windows CSV时。
可能会在某个时候拯救某人。
答案 30 :(得分:0)
好的,在Excel 2003到2007中找到了一种简单的方法。打开一个空白的xls工作簿。然后转到数据菜单,导入外部数据。选择您的csv文件。完成向导,然后在“列数据格式”中选择需要强制为“文本”的任何列。这会将整个列导入为文本格式,从而阻止Excel尝试将任何特定单元格视为日期。
答案 31 :(得分:-1)
在双引号中加上空格解决了问题!!
我在其中一个.csv文件列中有&#34; 7/8&#34; 等数据,MS-Excel将其转换为日期为&#34; 07-Aug&# 34 ;.但随着&#34; LibreOffice Calc&#34;没有问题。
为了解决这个问题,我只为前缀空格字符(在7之前添加了空格),如&#34; 7/8&#34; ,它对我有用。这是针对Excel-2007测试的。
答案 32 :(得分:-1)
另一种方法:
将要更改的列的格式转换为“文本”。选择要保留的所有单元格,进行复制。如果不取消选择这些列,请点击“修改&gt;选择性粘贴&gt;作为值”
另存为CSV。请注意,这必须是您对文件执行的最后一件事,因为当您重新打开它时,它会将自身格式化为日期,因为单元格格式无法保存在CSV文件中。
答案 33 :(得分:-1)
如果在字段的开头放置一个倒置的逗号,它将被解释为文本。
实施例:
25/12/2008
变为'25/12/2008
您还可以在导入时选择字段类型。
答案 34 :(得分:-3)
SELECT CONCAT('\'',NOW(),'\''), firstname, lastname
FROM your_table
INTO OUTFILE 'export.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '\"'
LINES TERMINATED BY '\n'
答案 35 :(得分:-4)
CSV - 以逗号分隔的值。只需通过文本编辑器而不是xls / xlsx / exel创建/编辑。 在编辑中,您可以按所需格式设置日期,并且必须保持完整。 这假设相同的文件然后以编程方式进行处理。