有没有人碰巧知道我可以为某个字段添加到我的 csv 中的令牌,以便 Excel 不会尝试将其转换为日期?
我正在尝试从我的应用程序中编写一个 .csv 文件,其中一个值恰好看起来很像 Excel 自动将其从文本转换为日期的日期。我尝试将所有文本字段(包括看起来像日期的字段)放在双引号内,但这没有任何效果。
我发现在双引号前加上一个 '=' 会完成你想要的。它强制数据为文本。
例如。="2008-10-03",="更多文字"
编辑(根据其他帖子):由于Jeffiekins 指出的 Excel 2007 错误,应该使用Andrew 提出的解决方案:"=""2008-10-03"""
我知道这是一个老问题,但问题不会很快消失。CSV 文件很容易从大多数编程语言中生成,相当小,在使用纯文本编辑器时易于人类阅读,并且无处不在。
问题不仅在于文本字段中的日期,而且任何数字也会从文本转换为数字。几个有问题的例子:
有时可以以一个或多个零 (0) 开头,这些零在转换为数字时会被丢弃。或者该值包含可能与数学运算符混淆的字符(如日期:/、-)。
我能想到的两种情况,如前所述,“前置=”解决方案可能并不理想是
如果在值中预先/附加一个非数字和/或非日期字符,则该值将被识别为文本并且不进行转换。非打印字符会很好,因为它不会改变显示的值。但是,普通的旧空格字符(\s,ASCII 32)对此不起作用,因为它被 Excel 截断,然后值仍然被转换。但是还有其他各种打印和非打印空格字符可以很好地工作。然而,最简单的方法是附加(添加)简单的制表符(\t,ASCII 9)。
这种方法的好处:
如果出于某种原因您不想使用该选项卡,请在 Unicode 表中查找其他合适的内容。
可能是生成 XML 文件,较新的 MS Excel 版本也接受某种格式的导入,并且允许更多类似于 .XLS 格式的选项,但我没有这方面的经验。
所以有多种选择。根据您的要求/应用程序,一个可能比另一个更好。
需要说的是,MS Excel 的较新版本(2013+)不再以电子表格格式打开 CSV - 工作流程中的另一个加速器使 Excel 变得不那么有用......至少,存在绕过它的说明。参见例如这个 Stackoverflow:如何在 Excel 2013 中正确显示 .csv 文件? .
根据 Jarod 的解决方案和 Jeffiekins 提出的问题,您可以修改
"May 16, 2011"
到
"=""May 16, 2011"""
我有一个类似的问题,这是帮助我无需编辑 csv 文件内容的解决方法:
如果您可以灵活地将文件命名为“.csv”以外的名称,则可以使用“.txt”扩展名来命名,例如“Myfile.txt”或“Myfile.csv.txt”。然后当您在 Excel 中打开它时(不是通过拖放,而是使用文件->打开或最近使用的文件列表),Excel 将为您提供“文本导入向导”。
在向导的第一页中,为文件类型选择“分隔”。
在向导的第二页中,选择“,”作为分隔符,如果您的值用引号括起来,还选择文本限定符
在第三页中,分别选择每一列,并为每一列分配“文本”而不是“常规”类型,以阻止 Excel 弄乱您的数据。
希望这可以帮助您或遇到类似问题的人!
警告:Excel '07(至少)有一个(另一个)错误:如果字段的内容中有逗号,它不会正确解析 ="field, contents",而是将逗号后面的所有内容放入后面的字段,不管引号。
我发现唯一可行的解决方法是在字段内容包含逗号时消除 = 。
这可能意味着有些字段无法在 Excel 中完全“正确”表示,但现在我相信没有人会感到惊讶。
唯一适合我的解决方案(也无需修改 CSV)。
Excel 2010:
Excel office365:(客户端版本)
注意: Excel office365(网络版),当我写这篇文章时,你将无法做到这一点。
在 C# 中创建要写入我的 CSV 文件的字符串时,我必须以这种方式对其进行格式化:
"=\"" + myVariable + "\""
在 Excel 2010 中打开一个新工作表。在数据功能区上单击“从文本获取外部数据”。选择您的 CSV 文件,然后单击“打开”。点击下一步”。取消选中“选项卡”,在“逗号”旁边打上复选标记,然后单击“下一步”。单击第一列的任意位置。按住 shift 键的同时拖动滑块直到您可以单击最后一列,然后松开 shift 键。单击“文本”单选按钮,然后单击“完成”
所有列都将作为文本导入,就像它们在 CSV 文件中一样。
在 Microsoft Office 2016 版本中仍然是一个问题,对于我们这些使用诸如 MARC1、MARCH1、SEPT1 等基因名称的人来说相当令人不安。我发现在 R 中生成“.csv”文件后最实用的解决方案,然后将与 Excel 用户打开/共享:
高温高压
这是我们在工作中首先生成 csv 文件时使用的简单方法,它确实会稍微改变值,因此它并不适合所有应用程序:
为 csv 中的所有值添加一个空格
该空间将被 Excel 从“1”、“2.3”和“-2.9e4”等数字中删除,但将保留在“01/10/1993”等日期和“TRUE”等布尔值上,阻止它们被转换为excel的内部数据类型。
它还可以阻止在读入时使用双引号,因此即使像“3.1415”这样的文本是用双引号括起来并在整个字符串前面加上空格,excel 保持 csv 中文本保持不变的万无一失的方法,即(使用单引号显示您将键入的内容)'“3.1415”'。然后在excel中你总是有原始字符串,除了它用双引号括起来并用空格前置,所以你需要考虑任何公式等中的那些。
(假设 Excel 2003 ......)
使用 Text-to-Columns 向导时,在第 3 步中,您可以指定每个列的数据类型。单击预览中的列,将行为不端的列从“常规”更改为“文本”。
这是我知道如何在不弄乱文件本身的情况下完成此操作的唯一方法。像往常一样使用 Excel,我通过在桌子上敲了几个小时的头来学习这一点。
将.csv文件扩展名改为.txt;这将阻止 Excel 在打开文件时自动转换文件。我是这样做的:将 Excel 打开到空白工作表,关闭空白表,然后 File => Open 并选择扩展名为 .txt 的文件。这会强制 Excel 打开“文本导入向导”,它会在其中询问您希望它如何解释文件的问题。首先选择分隔符(逗号、制表符等),然后(这是重要部分)选择一组列并选择格式。如果您想要文件中的确切内容,请选择“文本”,Excel 将仅显示分隔符之间的内容。
(EXCEL 2007 及更高版本)
任何一个:
Data > Get external data > From Text
无论哪种方式,您都会看到导入选项,只需选择包含日期的每一列并告诉 excel 格式化为“文本”而不是“一般”。
我为同样的问题所做的是在每个 csv 值之前添加以下内容:"=""" 并在每个 CSV 值之后添加一个双引号,然后在 Excel 中打开文件。以以下值为例:
012345,00198475
在 Excel 中打开之前,应将这些更改为:
"="""012345","="""00198475"
执行此操作后,每个单元格值在 Excel 中显示为公式,因此不会格式化为数字、日期等。例如,值 012345 显示为:
="012345"
这里提供的解决方案都不是一个好的解决方案。它可能适用于个别情况,但前提是您可以控制最终显示。以我为例:我的工作产生了他们出售给零售的产品清单。这是 CSV 格式并包含零件代码,其中一些以零开头,由制造商设置(不受我们控制)。去掉前导零,您实际上可能会匹配另一个产品。零售客户需要 CSV 格式的列表,因为后端处理程序也是我们无法控制的,并且每个客户都不同,因此我们无法更改 CSV 文件的格式。没有前缀'=',也没有添加标签。原始 CSV 文件中的数据是正确的;当客户在 Excel 中打开这些文件时,问题就开始了。许多客户并不真正精通计算机。他们几乎可以打开并保存电子邮件附件。我们正在考虑以两种略有不同的格式提供数据:一种作为 Excel 友好格式(使用上面建议的选项,添加一个 TAB,另一种作为“主”格式。但这可能是一厢情愿的想法,因为有些客户不明白为什么我们需要这样做。与此同时,我们继续解释为什么他们有时会在电子表格中看到“错误”的数据。在微软做出适当的改变之前,我认为没有适当的解决方案,只要人们无法控制最终用户的方式使用文件。但这可能是一厢情愿的想法,因为一些客户不会理解我们为什么需要这样做。同时,我们继续解释为什么他们有时会在电子表格中看到“错误”的数据。在微软做出适当的改变之前,我认为没有适当的解决方案,只要人们无法控制最终用户如何使用这些文件。但这可能是一厢情愿的想法,因为一些客户不会理解我们为什么需要这样做。同时,我们继续解释为什么他们有时会在电子表格中看到“错误”的数据。在微软做出适当的改变之前,我认为没有适当的解决方案,只要人们无法控制最终用户如何使用这些文件。
本周我遇到了这个约定,这似乎是一个很好的方法,但我在任何地方都找不到它的引用。有人熟悉吗?你能引用它的来源吗?我已经找了好几个小时了,但我希望有人会认可这种方法。
示例 1: =("012345678905") 显示为012345678905
示例 2: =("1954-12-12") 显示为1954-12-12,而不是12/12/1954。
你好我也有同样的问题
我写这个 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
它不是 Excel。Windows 确实将公式、数据识别为日期并自动更正。您必须更改 Windows 设置。
“控制面板”(->“切换到经典视图”)->“区域和语言选项”->选项卡“区域选项”->“自定义...”->选项卡“数字”->然后更改符号根据你想要的。
http://www.pcreview.co.uk/forums/enable-disable-auto-convert-number-date-t3791902.html
它将在您的计算机上运行,如果这些设置没有更改,例如在您客户的计算机上,他们将看到日期而不是数据。
在不修改 csv 文件的情况下,您可以:
excel 将正确格式化并将您的 csv 单元格分隔为文本格式,忽略自动日期格式。
一种愚蠢的解决方法,但它胜过在导入之前修改 csv 数据。Andy Baird 和 Richard 有点逃避这种方法,但错过了几个重要步骤。
在我的例子中,使用 R 生成的 csv 文件中的“Sept8”被 Excel 2013 转换为“8-Sept”。通过使用 xlsx 包中的 write.xlsx2() 函数生成 xlsx 格式的输出文件,解决了这个问题, 可以由 Excel 加载而无需进行不必要的转换。因此,如果给您一个 csv 文件,您可以尝试将其加载到 R 中并使用 write.xlsx2() 函数将其转换为 xlsx。
我知道这是一个旧线程。对于像我这样通过 PowerShell COM 对象使用 Office 2013 仍然存在此问题的人,可以使用opentext 方法。问题是这种方法有很多参数,有时是互斥的。要解决此问题,您可以使用本文介绍的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 允许您使用矩阵设置一系列单元格的值。所以我使用这个博客中的算法将 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" ";"
您可以按原样使用上面的代码;它应该将任何 CSV 转换为 Excel。只需更改 CSV 的路径和底部的分隔符即可。
最简单的解决方案我今天才发现。
完成编辑后,您可以随时在 Word 中重新打开它,以再次用连字符替换短划线。
使用 Google Drive(或 Numbers,如果您在 Mac 上)的解决方法:
或者,如果您在 Mac 上执行第 3 步,您可以在 Numbers 表格中打开数据。
(EXCEL 2016及以后,其实老版本我没试过)
如果有人仍在寻找答案,那么下面的行对我来说非常有用
我进入了=("my_value")
。
即=("04SEP2009")
显示为04SEP2009
不像09/04/2009
这同样适用于超过 15 位的整数。他们不再被修剪了。
好的,在 Excel 2003 到 2007 中找到了一种简单的方法。打开一个空白的 xls 工作簿。然后进入数据菜单,导入外部数据。选择您的 csv 文件。通过向导,然后在“列数据格式”中选择任何需要强制为“文本”的列。这会将整个列作为文本格式导入,以防止 Excel 尝试将任何特定单元格视为日期。
Mac Office 2011 和 Office 2013 中仍然存在此问题,我无法阻止它发生。这似乎是一个基本的事情。
在我的情况下,我在用逗号正确括起来的 CSV 中有诸如“1 - 2”和“7 - 12”之类的值,这会自动转换为 excel 中的日期,如果您随后尝试将其转换为纯文本,您会得到日期的数字表示,例如 43768。此外,它将条形码和 EAN 数字中的大数字重新格式化为无法转换回的 123E+ 数字。
我发现 Google Drive 的 Google Sheets 不会将数字转换为日期。条形码中每 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 解决方案。此代码以原始形式保留数据。
如果您准备更改原始源 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 选项卡/来自文件/来自 Text-CSV,然后“加载”以作为表格打开。(您可以从“数据类型检测”选项中选择“不检测数据类型”)。
另一种方法:
将要更改的列的格式转换为“文本”。选择要保留的所有单元格,复制。在不取消选择这些列的情况下,单击“编辑 > 选择性粘贴 > 作为值”
另存为 CSV。请注意,这必须是您对文件执行的最后一件事,因为当您重新打开它时,它会将自身格式化为日期,因为单元格格式无法保存在 CSV 文件中。
将表格粘贴到 word 中。进行搜索/替换并将所有 - (破折号)更改为 -- (双破折号)。复制并粘贴到 Excel 中。可以对其他符号 (/) 等执行相同操作。如果需要在 Excel 中更改回破折号,只需将该列格式化为文本,然后进行更改。希望这可以帮助。
如果在字段的开头放置一个逗号,它将被解释为文本。
例子:
25/12/2008
变成'25/12/2008
您还可以在导入时选择字段类型。
双引号中的空格前缀解决了这个问题!
我在 .csv 文件列之一中有类似“7/8”的数据,MS-Excel 将其转换为日期为“07-Aug”。但是使用“LibreOffice Calc”没有问题。
为了解决这个问题,我只是为空格字符(在 7 之前添加了空格)添加了前缀,例如“7/8”,它对我有用。这是针对 Excel-2007 测试的。
SELECT CONCAT('\'',NOW(),'\''), firstname, lastname
FROM your_table
INTO OUTFILE 'export.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '\"'
LINES TERMINATED BY '\n'
CSV - 逗号分隔值。只需通过文本编辑器而不是 xls/xlsx/exel 创建/编辑。在编辑中,您可以将日期设置为所需的格式,并且必须保持原样。这是假设随后以编程方式处理相同的文件。