因此,您使用下面的代码创建.vbs文件(例如Modify_CSV.vbs),保存并关闭它 . Drag and Drop 您的原始文件到您的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
30 回答
这里提供的解决方案都不是一个好的解决方案 . 它可能适用于个别情况,但仅限于您控制最终显示 . 举个例子:我的作品产生了他们卖给零售的产品清单 . 这是CSV格式,包含部分代码,其中一些以零开头,由制造商设置(不在我们的控制之下) . 拿走前导零,你可能实际上匹配另一个产品 . 零售客户希望列表以CSV格式存在,因为后端处理程序也是我们无法控制的,每个客户也不同,因此我们无法更改CSV文件的格式 . 没有前缀'=',也没有添加标签 . 原始CSV文件中的数据是正确的;当客户在Excel中打开这些文件时,问题就开始了 . 许多客户并不是真正精通计算机的人 . 他们可以打开并保存电子邮件附件 . 我们正在考虑以两种稍微不同的格式提供数据:一种是Excel Friendly(使用上面建议的选项添加一个TAB,另一种作为'master' . 但这可能是一厢情愿的想法,因为有些客户不会理解为什么我们需要这样做 . 同时我们继续解释为什么他们有时会在他们的电子表格中看到“错误的”数据 . 直到微软做出适当的改变,我认为没有适当的解决方案,只要一个人无法控制最终用户使用文件 .
好的,在Excel 2003到2007中找到了一种简单的方法 . 打开一个空白的xls工作簿 . 然后转到数据菜单,导入外部数据 . 选择您的csv文件 . 完成向导,然后在“列数据格式”中选择需要强制为“文本”的任何列 . 这会将整个列导入为文本格式,从而阻止Excel尝试将任何特定单元格视为日期 .
它不是Excel . Windows确实识别公式,数据作为日期和自动更正 . 您必须更改Windows设置 .
“控制面板”( - >“切换到经典视图”) - >“区域和语言选项” - >选项卡“区域选项” - >“自定义...” - >选项卡“数字” - >然后更改符号根据你的要求 .
http://www.pcreview.co.uk/forums/enable-disable-auto-convert-number-date-t3791902.html
它可以在您的计算机上运行,如果这些设置没有更改,例如在客户的计算机上,他们将看到日期而不是数据 .
使用Google Cloud 端硬盘的解决方法(如果您使用的是Mac,则使用Numbers):
在Excel中打开数据
将包含错误数据的列的格式设置为文本(格式>单元格>数字>文本)
将.csv加载到Google Cloud 端硬盘中,然后使用Google表格将其打开
复制违规列
将列粘贴到Excel中作为文本(编辑>选择性粘贴>文本)
或者,如果您在Mac上执行第3步,则可以在Numbers中打开数据 .
前缀 space in double quotes 解决了这个问题!!
我在其中一个.csv文件列中有 "7/8" 等数据,MS-Excel将其转换为"07-Aug" . 但是"LibreOffice Calc"没有问题 .
为了解决这个问题,我只是将空格字符(在7之前添加了空格)作为 " 7/8" 的前缀,它对我有用 . 这是针对Excel-2007测试的 .
在我的例子中,使用R生成的csv文件中的“Sept8”被Excel 2013转换为“8-Sept” . 通过在xlsx包中使用write.xlsx2()函数生成xlsx格式的输出文件解决了这个问题 . ,可以通过Excel加载而无需进行不必要的转换 . 因此,如果给你一个csv文件,你可以尝试将它加载到R中并使用write.xlsx2()函数将其转换为xlsx .
我知道这是一个老话题 . 对于像我这样的人,使用office 2013通过powershell com对象仍然有这个问题可以使用opentext method . 问题是这个方法有很多参数,有时是互斥的 . 要解决此问题,您可以使用this post中引入的invoke-namedparameter方法 . 一个例子是
不幸的是,我刚刚发现当单元格包含换行符时,此方法会以某种方式破坏csv解析 . csv支持这一点,但微软实现似乎有问题 . 它也以某种方式检测不到德国特定的字符 . 赋予它正确的文化并没有改变这种行为 . 所有文件(csv和脚本)都使用utf8编码保存 . 首先,我编写了以下代码以按单元格插入csv单元格 .
但这是极其缓慢的,这就是我寻找替代方案的原因 . 显然,Excel允许您使用矩阵设置一系列单元格的值 . 所以我用了算法this blog在多阵列中转换csv .
您可以使用上面的代码,因为它应该将任何csvs转换为excel . 只需更改csv的路径和底部的分隔符 .
(假设Excel 2003 ...)
使用“文本到列”向导时,在步骤3中,您可以指定每个列的数据类型 . 单击预览中的列,将行为不当列从“常规”更改为“文本” .
使用Jarod的解决方案和Jeffiekins提出的问题,你可以修改
至
在C#中创建要写入我的CSV文件的字符串时,我必须以这种方式格式化:
最简单的解决方案我今天才想到这一点 .
在Word中打开
用短划线替换所有连字符
保存并关闭
在Excel中打开
完成编辑后,您可以再次在Word中重新打开它,再次使用连字符替换连字符 .
这是我知道如何在不弄乱文件内部的情况下实现此目的的唯一方法 . 像往常一样,我通过在桌面上敲打几个小时来学习这一点 .
将.csv文件扩展名更改为.txt;这将阻止Excel在文件打开时自动转换文件 . 我是这样做的:打开Excel到空白工作表,关闭空白工作表,然后File => Open并选择扩展名为.txt的文件 . 这会强制Excel打开“文本导入向导”,它会询问您有关如何解释文件的问题 . 首先选择分隔符(逗号,制表符等),然后(这是重要的部分)选择一组列并选择格式 . 如果你想要文件中的确切内容然后选择“文本”,Excel将显示分隔符之间的内容 .
在Excel 2010中打开一个新工作表 . 在“数据”功能区上,单击“从文本获取外部数据” . 选择您的CSV文件,然后单击“打开” . 点击下一步” . 取消选中“Tab”,在“逗号”旁边放置一个复选标记,然后单击“下一步” . 单击第一列上的任意位置 . 按住shift键的同时拖动滑块直到您可以单击最后一列,然后释放shift键 . 单击“文本”单选按钮,然后单击“完成”
所有列都将作为文本导入,就像它们在CSV文件中一样 .
在Microsoft Office 2016版本中仍然是一个问题,对于我们这些使用基因名称的人来说相当令人不安,例如MARC1,MARCH1,SEPT1等 . 我发现在R中生成“.csv”文件后最实用的解决方案,然后将与Excel用户打开/共享:
以文本形式打开CSV文件(记事本)
复制它(ctrl a,ctrl c) .
将其粘贴到新的Excel工作表中 - 它将作为长文本字符串粘贴在一列中 .
选择/选择此列 .
转到Data- "Text to columns...",在打开的窗口中选择"delimited"(下一步) . 检查"comma"是否已标记(标记它已经显示数据与下面列的分隔)(下一步),在此窗口中,您可以选择所需的列并将其标记为文本(而不是常规)(完成) .
HTH
Mac Office 2011和Office 2013中仍然存在此问题,我无法阻止它发生 . 这似乎是一件基本的事情 .
在我的情况下,我在CSV中正确包含了“1 - 2”和“7 - 12”之类的值,这会自动转换为excel中的日期,如果您尝试将其转换为纯文本,您将获得日期的数字表示,例如43768.此外,它将条形码和EAN编号中的大数字重新格式化为123E数字,这些数字无法转换回来 .
我发现Google Cloud 端硬盘的Google表格并没有将这些数字转换为日期 . 条形码每3个字符中都有逗号,但这些字符很容易删除 . 它非常适合处理CSV,特别是在处理MAC / Windows CSV时 .
有时可能会救人 .
嗨我有同样的问题,
我写这个vbscipt来创建另一个CSV文件 . 新的CSV文件将在每个字段的字体中有一个空格,因此excel会将其理解为文本 .
因此,您使用下面的代码创建.vbs文件(例如Modify_CSV.vbs),保存并关闭它 . Drag and Drop 您的原始文件到您的vbscript文件 . 它将在同一位置创建一个文件名为"SPACE_ADDED"的新文件 .
我知道这是一个老问题,但问题不会很快消失 . CSV文件很容易从大多数编程语言中生成,相当小,人们可以在简单的文本编辑器中使用,并且无处不在 .
问题不仅在于文本字段中的 dates ,而且 anything numeric 也会从文本转换为数字 . 这是一个有问题的例子:
邮政编码
电话号码
政府身份证号码
有时 can 以一个或多个零(0)开始,当转换为数字时会被抛弃 . 或者该值包含可能与数学运算符混淆的字符(如日期: /, -) .
我能想到的两个案例是"prepending ="解决方案,如前所述, might not be ideal 是
文件可能导入MS Excel以外的程序(MS Word的邮件合并功能会出现在脑海中),
人类可读性可能很重要 .
我的黑客可以解决这个问题
如果在值中前置/附加非数字和/或非日期字符,则该值将被识别为文本而不进行转换 . 非打印字符会很好,因为它不会改变显示的值 . 但是,普通旧空格字符(\ s,ASCII 32)对此不起作用,因为它被Excel切掉,然后值仍然被转换 . But 还有各种其他打印和非打印空间字符,可以很好地工作 . The easiest 然而是 append (add after) the simple tab character (\t, ASCII 9).
这种方法的好处:
可通过键盘或易于记忆的ASCII码(9)获得,
不打扰输入,
通常不会打扰邮件合并结果(取决于模板布局 - 但通常只是在一行的末尾添加一个宽空格) . (如果这是一个问题,请查看其他字符,例如零宽度空间(ZWSP,Unicode U 200B)
在记事本(等)中查看CSV时,
不是一个很大的障碍,
可以通过在Excel(或记事本等)中查找/替换来删除 .
您无需导入CSV,但只需双击即可在Excel中打开CSV .
如果您不想使用该选项卡,请在Unicode表中查找其他合适的选项 .
另一种选择
可能是生成XML文件,其中某些格式也被新的MS Excel版本接受导入,并且允许更多类似于.XLS格式的选项,但我没有这方面的经验 .
所以有各种选择 . 根据您的要求/应用,一个可能比另一个更好 .
加法
需要说明的是,MS Excel的新版本(2013)不会使Excel变得不那么有用......至少,存在解决它的说明 . 参见例如这个Stackoverflow:How to correctly display .csv files within Excel 2013? .
我为此同样的问题所做的是在每个csv值之前添加以下内容:“=”“”和每个CSV值之后的一个双引号,然后在Excel中打开文件 . 以下列值为例:
在Excel中打开之前应更改这些内容:
执行此操作后,每个单元格值在Excel中显示为公式,因此不会格式化为数字,日期等 . 例如,值012345显示为:
将表粘贴到单词中 . 进行搜索/替换并将所有 - (破折号)更改为 - (双击) . 复制并粘贴到Excel中 . 可以对其他符号(/)等执行相同操作 . 如果需要在Excel中更改回一次破折号,只需将列格式化为文本,然后进行更改 . 希望这可以帮助 .
如果在字段的开头放置一个倒置的逗号,它将被解释为文本 .
示例:
25/12/2008
变为'25/12/2008
您还可以在导入时选择字段类型 .
(EXCEL 2007及更高版本)
如何在不编辑源文件的情况下强制excel不“检测”日期格式
Either:
将文件重命名为.txt
如果您不能这样做,而不是直接在Excel中打开CSV文件,请创建一个新工作簿然后转到
Data > Get external data > From Text
并选择您的CSV .
无论哪种方式,您都会看到导入选项,只需选择包含日期的每列,并告诉excel将格式设置为“text”而不是“general” .
我遇到了类似的问题,这是帮助我而不必编辑csv文件内容的解决方法:
如果您可以灵活地将文件命名为“.csv”以外的其他名称,则可以使用“.txt”扩展名来命名,例如“Myfile.txt”或“Myfile.csv.txt” . 然后,当您在Excel中打开它(而不是通过拖放,但使用文件 - >打开或最近使用的文件列表),Excel将为您提供“文本导入向导” .
在向导的第一页中,为文件类型选择“Delimited” .
在向导的第二页中,选择“,”作为分隔符,如果用引号括起值,也可以选择文本限定符
在第三页中,分别选择每一列,并为每个列分配“文本”而不是“常规”,以防止Excel弄乱您的数据 .
希望这可以帮助您或有类似问题的人!
2018
唯一适合我的解决方案(也没有修改CSV) .
Excel 2010:
创建新工作簿
数据>从文本>选择您的CSV文件
在弹出窗口中,选择"Delimited"单选按钮,然后单击"Next >"
分隔符复选框:仅勾选"Comma"并取消选中其他选项,然后单击"Next >"
在"Data preview"中,滚动到最右侧,然后按住shift并单击最后一列(这将选择所有列) . 现在在"Column data format"中选择单选按钮"Text",然后单击"Finish" .
Excel office365: (客户端版)
创建新工作簿
数据>从文本/ CSV>选择您的CSV文件
数据类型检测>不检测
Note: Excel office365(网络版),正如我写的那样,你将无法做到这一点 .
我这样做的信用卡号码不断转换为科学记数法:我最终将我的.csv导入Google表格 . 导入选项现在允许禁用数值的自动格式化 . 我将任何敏感列设置为纯文本并下载为xlsx .
这是一个糟糕的工作流程,但至少我的 Value 观是他们应有的 .
警告:Excel '07(至少)有一个(另一个)错误:如果字段内容中有逗号,它不会正确解析=“字段,内容”,而是将逗号后的所有内容放入以下字段,不管引号如何 .
我发现唯一的解决方法是在字段内容包含逗号时消除= .
这可能意味着有些字段无法在Excel中完全“正确”表示,但是现在我相信没有人会感到惊讶 .
本周我遇到了这个约会,这似乎是一个很好的方法,但我无法在任何地方找到它 . 有人熟悉吗?你能引用它的来源吗?我没有看过几个小时,但我希望有人会认识到这种方法 .
示例1:=("012345678905")显示为 012345678905
示例2:=("1954-12-12")显示为 1954-12-12 ,而不是 12/12/1954 .
这是我们在首先生成csv文件时使用的简单方法,它确实更改了一些值,因此它不适合所有应用程序:
在csv中为所有值预先添加空格
这个空间将被excel从诸如“1”,“2.3”和“-2.9e4”之类的数字中剥离出来,但将保留在“01/10/1993”之类的日期和“TRUE”之类的布尔值,阻止它们被转换为excel的内部数据类型 .
它还会在读入时停止双引号,因此在csv中制作文本的万无一失的方法仍然保持不变,即使是“3.1415”之类的文本是用双引号括起来并在整个字符串前加一个空格,即(使用单引号显示您要键入的内容)'“3.1415”' . 然后在excel中你总是有原始的字符串,除了它被双引号括起来并以空格为前缀,所以你需要考虑任何公式中的那些等 .
(EXCEL 2016及更高版本,实际上我没有尝试过旧版本)
打开新的空白页面
转到标签"Data"
单击"From Text/CSV"并选择您的csv文件
检查预览您的数据是否正确 .
在某些列转换为日期时,单击"edit",然后通过单击列 Headers 中的日历选择文本类型
点击"Close & Load"
在不修改csv文件的情况下,您可以:
将Excel格式单元格选项更改为"text"
然后使用"Text Import Wizard"定义csv单元格 .
导入后删除该数据
然后只粘贴为纯文本
excel将正确格式化和分离您的csv单元格作为忽略自动日期格式的文本格式 .
这是一种愚蠢的工作,但它在导入之前会改变csv数据 . Andy Baird和Richard对这种方法有所不同,但错过了几个重要的步骤 .
我发现在双引号之前加上'='可以实现你想要的 . 它强制数据为文本 .
例如 . =“2008-10-03”,=“更多文字”
EDIT (according to other posts) :因为Excel 2007 bug noted by Jeffiekins应该使用solution proposed by Andrew:
"=""2008-10-03"""