特定のフィールドのcsvに追加できるトークンがあるためにExcelがそれを日付に変換しないようにしているかどうかを知っている人はいますか?
私は自分のアプリケーションから.csvファイルを書き込もうとしていますが、その値の1つは、Excelが自動的にテキストから日付に変換している日付のように見えます。すべてのテキストフィールド(日付のように見えるものも含む)を二重引用符で囲んでみましたが、効果はありません。
二重引用符の前に「=」を付けると、望みどおりの結果が得られることがわかりました。データをテキストにします。
例えば。 = "2008-10-03"、= "その他のテキスト"
EDIT(他の記事による) :Jeffiekinsが指摘した Excel 2007のバグのため 1はAndrewが提案した 解決策を使用すべきです :"=""2008-10-03"""
私はこれが古い質問であることを知っています、しかし問題はすぐには消えません。 CSVファイルは、ほとんどのプログラミング言語から簡単に生成でき、かなり小さく、プレーンテキストエディタを使用して人間が読むことができ、どこにでもあります。
問題は 日付 がテキストフィールドにあるだけでなく、 何でも数値 がテキストから数値に変換されることです。これが問題となる例をいくつか紹介します。
can は1つ以上のゼロ(0)で始まることがありますが、数値に変換すると破棄されます。または、値に数学演算子と混同される可能性のある文字が含まれています(日付のように/、 - )。
私が考えることができる2つのケースは、前述のように "prepending ="ソリューション、 は理想的ではないかもしれません is
値に数値以外の文字や日付以外の文字が追加されている場合、値はテキストとして認識され、変換されません。印刷されない文字は表示された値を変えないので良いでしょう。ただし、プレーンスペース文字(\ s、ASCII 32)は、Excelで切り落とされても値が変換されるため、これでは機能しません。 しかし 他のさまざまな印刷用および非印刷用のスペース文字がうまく機能します。 最も簡単な は、 単純なタブ文字(\ t、ASCII 9)を追加(後に追加)することです。
このアプローチの利点:
このタブを使用したくない理由がある場合は、Unicodeテーブルを調べて他に適切なものを探してください。
xMLファイルを生成するためかもしれません。そのため、特定のフォーマットも新しいMS Excelバージョンでインポートすることができ、.XLSフォーマットに似た多くのオプションを使用できますが、私はこれに関する経験がありません。
だから、さまざまな選択肢があります。要件やアプリケーションによっては、一方が他方より優れている場合があります。
MS Excelの新しいバージョン(2013+)では、スプレッドシート形式でCSVを開くことはもうできない - ワークフローのスピードがもう1つ速くなるため、Excelの使い勝手が悪くなる…少なくとも、回避するための指示がある。例えば参照。このStackoverflow: Excel 2013内で.csvファイルを正しく表示する方法 。
Jarodの解決策とJeffiekinsによって提起された問題を解決して、あなたは修正することができます
"May 16, 2011"
に
"=""May 16, 2011"""
私は同様の問題を抱えていました、そしてこれはcsvファイルの内容を編集する必要なしに私を助けた回避策です:
ファイルに「.csv」以外の名前を付ける柔軟性がある場合は、「Myfile.txt」や「Myfile.csv.txt」のように、「。txt」という拡張子を付けてファイル名を付けることができます。次に、ドラッグアンドドロップではなく、ファイル - >開くまたは最近使用したファイルのリストを使用してExcelで開くと、「テキストのインポートウィザード」が表示されます。
ウィザードの最初のページで、ファイルの種類として[区切り記号]を選択します。
ウィザードの2ページ目で、区切り文字として "、"を選択し、値を引用符で囲んだ場合はテキスト修飾子も選択します。
3番目のページで、すべての列を個別に選択し、Excelにデータが表示されないようにするために、 "全般"ではなく "テキスト"をそれぞれ割り当てます。
これがあなたや同じような問題を抱えている人に役立つことを願っています!
警告:Excel '07(少なくとも)にはa(nother)バグがあります。フィールドの内容にコンマがあると、= "field、contents"が正しく解析されず、正しく表示されます。引用符に関係なく、コンマの後のすべてを次のフィールドに入れます。
私が見つけた唯一の回避策は、フィールドの内容にカンマが含まれている場合に=を削除することです。
これは、Excelで正確に「正しい」ことを表現することが不可能ないくつかのフィールドがあることを意味するかもしれませんが、今では誰も驚くことではないと信じています。
C#で私のCSVファイルに書かれる文字列を作成している間、私はこのようにそれをフォーマットしなければなりませんでした:
"=\"" + myVariable + "\""
Excel 2010で新しいシートを開きます。データリボンで[テキストから外部データを取得]をクリックします。 CSVファイルを選択してから[開く]をクリックします。 「次へ」をクリックしてください。 [Tab]のチェックを外し、[Comma]の横にチェックマークを付けて、[Next]をクリックします。最初の列のどこかをクリックしてください。 Shiftキーを押したまま、最後の列をクリックできるまでスライダーを横にドラッグしてから、Shiftキーを放します。 [テキスト]ラジオボタンをクリックしてから、[完了]をクリックします。
CSVファイルと同じように、すべての列がテキストとしてインポートされます。
まだMicrosoft Office 2016リリースの問題であり、MARC1、MARCH1、SEPT1などの遺伝子名を扱う私達にとっては厄介です。Rで ".csv"ファイルを生成した後に最も実用的であることがわかったそれが開かれ、Excelユーザーと共有されます。
HTH
これは、最初にcsvファイルを生成するときにここで使用している簡単な方法です。値を少し変更するため、すべてのアプリケーションに適しているわけではありません。
Csvのすべての値の前にスペースを追加
このスペースはExcelによって "1"、 "2.3"、 " - 2.9e4"のような数字から取り除かれますが、 "01/10/1993"のような日付や "TRUE"のようなブール値のままになります。 Excelの内部データ型.
それはまた、読み込み時に二重引用符がザップされるのを防ぎます。そのため、csv内のテキストをExcelによって変更されないままにする最も簡単な方法は、 "3.1415"のようなテキストです。すなわち(あなたがタイプするものを示すために一重引用符を使って) '"3.1415"'。 Excelでは、元の文字列が常に使用されます。ただし、二重引用符で囲まれ、先頭にスペースが挿入されている場合を除きます。
これは私がファイル自体の中で混乱することなくこれを達成する方法を知っている唯一の方法です。 Excelでいつものように、私は何時間も机の上で頭を打つことによってこれを学びました。
.csvファイル拡張子を.txtに変更します。これが開かれると、Excelがファイルを自動変換しないようにします。これを行う方法は次のとおりです。Excelを開いて空白のワークシートを開き、空白のシートを閉じてからFile => Openの順に選択し、拡張子が.txtのファイルを選択します。これにより、Excelは "テキストのインポートウィザード"を開き、そこでファイルの解釈方法について質問します。最初に区切り文字(コンマ、タブなど)を選択してから(ここで重要な部分です)、一連の列の列を選択してフォーマットを選択します。ファイルの内容を正確に知りたい場合は、[テキスト]を選択すると、Excelは区切り文字の間にあるものだけを表示します。
(Excel 2003を想定しています...)
Text-to-Columns Wizard hasを使用する場合、手順3で各列のデータ型を指定できます。プレビューの列をクリックして、誤動作の列を「一般」から「テキスト」に変更します。
ここで提供される解決策のどれも良い解決策ではありません。個々のケースでうまくいくかもしれませんが、最終的な表示を管理している場合に限ります。私の例を挙げましょう:私の仕事は小売りに売る製品のリストを作り出します。これはCSV形式で、部品コードが含まれています。そのうちのいくつかは製造業者によって設定されたゼロで始まります(当社の管理下にはありません)。先行ゼロを取り除けば、実際には他の製品と一致する可能性があります。小売顧客はバックエンド処理プログラムのためにCSV形式のリストを望んでいます。これも私たちの管理下にはなく、顧客ごとに異なるため、CSVファイルの形式を変更することはできません。接頭辞「=」もタブも追加されていません。生のCSVファイルのデータは正しいです。顧客がこれらのファイルをExcelで開くと問題が発生します。そして多くの顧客は実際にはコンピュータに精通していません。彼らはちょうど電子メールの添付ファイルを開いて保存することができます。 1つはExcelに優しいものとして(上記でTABを追加して提案されたオプションを使用し、もう1つは「マスター」として使用する)、2つのわずかに異なる形式でデータを提供することを考えています。マイクロソフトが適切な変更を加えるまでは、エンドユーザーの操作方法を制御できない限り、これに対する適切な解決策は得られません。ファイルを使用してください。
(Excel 2007以降)
どちらか:
Data > Get external data > From Text
どちらの方法でも、インポートオプションが表示されます。日付を含む各列を選択し、Excelに「一般」ではなく「テキスト」としてフォーマットするように指示します。
2018
私のために働いた唯一の適切な解決策(そしてまた CSVを修正せずに )。
Excel 2010:
Excel office365: (クライアントバージョン)
注: Excel office365(Web版)、これを書いているときは、できません。
この同じ問題に対して私がしたことは、各csv値の前にExcelでファイルを開く前に、 "=" ""と各CSV値の後に1つの二重引用符を追加することでした。例えば以下の値を取ります。
012345,00198475
これらはExcelで開く前に変更する必要があります。
"="""012345","="""00198475"
これを実行すると、すべてのセル値がExcelの数式として表示されるため、数値、日付などの書式設定は行われません。たとえば、012345という値は次のように表示されます。
="012345"
私は今週、この規則に出会った。これは優れたアプローチであるように思われるが、私はそれがどこにも言及されているのを見つけることができない。誰もがそれに精通していますか?あなたはそれについての情報源を引用することができますか?私は何時間も探しませんでしたが、誰かがこのアプローチを認識することを願っています。
例1:=( "012345678905")は 012345678905 と表示されます。
例2:=( "1954-12-12")は 1954-12-12 として表示され、 12/12/1954 とは表示されません。
こんにちは私は同じ問題を抱えている、
別のCSVファイルを作成するためにこのvbsciptを書きます。新しい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
Csvファイルを修正しなくても、次のことができます。
Excelは、自動日付フォーマットを無視して、csvセルをテキストフォーマットとして正しくフォーマットして分離します。
愚かな回避策のようなものですが、インポートする前にcsvデータを変更するのに勝ります。 Andy BairdとRichardはこの方法を避けましたが、いくつか重要なステップを逃しました。
それはExcelではありません。 Windowsは式、データを日付として認識し、自動修正します。 Windowsの設定を変更する必要があります。
「コントロールパネル」( - >「クラシック表示に切り替える」) - >「地域と言語のオプション」 - >「地域のオプション」 - >「カスタマイズ...」 - >「番号」のタブ - >そして記号を変更するあなたが欲しいものに応じて。
http://www.pcreview.co.uk/forums/enable-disable-auto-convert-number-date-t3791902.html
これらの設定が、たとえば顧客のコンピュータで変更されていない場合は、データではなく日付が表示されます。
Googleドライブ(またはMacの場合はNumbers)を使用した回避策:
ステップ3でMacを使用している場合は、データをNumbersで開くこともできます。
(Excel 2016以降、実際には以前のバージョンで試したことはありません)
私の場合、Rを使用して生成されたcsvファイルの "Sept8"はExcel 2013によって "8-Sept"に変換されました。xlsxパッケージのwrite.xlsx2()関数を使用してxlsx形式の出力ファイルを生成することで問題を解決しました。これは、不要な変換を行わずにExcelによって読み込むことができます。あなたがcsvファイルを与えられているのであれば、あなたはそれをRにロードしてwrite.xlsx2()関数を使ってxlsxに変換することを試みることができます。
これは古いスレッドです。私のような人たちのために、powershell comオブジェクトを介してoffice 2013を使用してこの問題を解決しない場合は、 opentextメソッド を使用できます。問題は、このメソッドには多くの引数があり、それらが相互に排他的な場合があることです。この問題を解決するには、 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によってサポートされていますが、microsoftsの実装にはバグがあるようです。また、どういうわけかドイツ語特有の文字を検出しませんでした。正しい文化を与えても、この動作は変わりませんでした。すべてのファイル(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へのパスと一番下の区切り文字を変更するだけです。
わかりました2007年を通じてExcel 2003でこれを行う簡単な方法を見つけました。空白のxlsブックを開きます。それからデータメニューに行き、外部データをインポートしてください。あなたのcsvファイルを選択してください。ウィザードを実行してから、「列データ形式」で、「テキスト」にする必要がある列を選択します。これにより、その列全体がテキスト形式としてインポートされ、Excelが特定のセルを日付として扱おうとするのを防ぎます。
最も簡単な解決策今日私はこれを考え出しました。
編集が終わったら、いつでも再びWordで開いて、ダッシュをハイフンに置き換えることができます。
Wordにテーブルを貼り付けます。検索/置換を行い、すべての - (ダッシュ)を - (二重ダッシュ)に変更します。コピーしてExcelに貼り付けます。他の記号(/)などでも同じことができます。Excelで一度ダッシュに戻す必要がある場合は、列をテキストにフォーマットしてから変更します。お役に立てれば。
この問題はMac Office 2011とOffice 2013にはまだ残っています。これを防ぐことはできません。そんな基本的なことのようです。
私の場合、CSV内の "1 - 2"や "7 - 12"のような値を逆カンマで正しく囲みましたが、後でプレーンテキストに変換しようとすると自動的にExcel内の日付に変換されます。 43768などの日付の数値表現。さらに、バーコードやEAN番号に含まれる大きな数値を123E +の数値に再フォーマットします。これは元に戻すことはできません。
グーグルドライブのグーグルシートは数字を日付に変換しないことを私は発見した。バーコードは3文字ごとにカンマを含みますが、これらは簡単に削除されます。特にMAC/Windows CSVを扱う場合、CSVをうまく処理します。
いつか誰かを救うかもしれません。
科学的表記に変換し続けるクレジットカード番号に対してこれを行います。私は、.csvをGoogle Sheetsにインポートしてしまいます。インポートオプションは現在数値の自動フォーマットを無効にすることができます。機密性の高い列をプレーンテキストに設定し、xlsxとしてダウンロードします。
それはひどいワークフローですが、少なくとも私の価値観は本来あるべき姿のまま残されています。
数字を貼り付ける前に、基本的にテキストとして出力範囲をフォーマットするこのvbaマクロを作りました。 Excelが日付として解釈することなく、8/11、23/6、1/3などの値を貼り付けたい場合に最適です。
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解決策を見たことがありません。このコードはデータを元の形式で保持します。