Excelが特定のフィールドのcsvに追加できるトークンがあるかどうかを誰かが知っているので、Excelはそれを日付に変換しようとしませんか?
アプリケーションから.csvファイルを書き込もうとしていますが、値の1つが、Excelがテキストから日付に自動的に変換する日付のように見えます。すべてのテキストフィールド(日付のように見えるものを含む)を二重引用符で囲んでみましたが、効果はありません。
Excelが特定のフィールドのcsvに追加できるトークンがあるかどうかを誰かが知っているので、Excelはそれを日付に変換しようとしませんか?
アプリケーションから.csvファイルを書き込もうとしていますが、値の1つが、Excelがテキストから日付に自動的に変換する日付のように見えます。すべてのテキストフィールド(日付のように見えるものを含む)を二重引用符で囲んでみましたが、効果はありません。
回答:
二重引用符の前に '='を置くと、目的の結果が得られることがわかりました。データを強制的にテキストにします。
例えば。= "2008-10-03"、= "その他のテキスト"
編集(他の投稿による):Jeffiekinsによって指摘されたExcel 2007のバグのため、Andrewによって提案されたソリューションを使用する必要があります:"=""2008-10-03"""
これは古い質問であることはわかっていますが、問題はすぐには解消されません。CSVファイルは、ほとんどのプログラミング言語から簡単に生成でき、かなり小さく、プレーンテキストエディターを使用してクランチで人間が読める形式で、ユビキタスです。
問題は、テキストフィールドの日付だけでなく、数値もテキストから数値に変換されます。これが問題となるいくつかの例:
これは、1つまたは複数のゼロ(0)で始まることがあり、数値に変換すると破棄されます。または、値に算術演算子と混同される可能性のある文字が含まれています(日付:/、-など)。
前述のように、 "prepending ="ソリューションが理想的でない可能性があると考えることができる2つのケースは、
値に数値以外の文字や日付以外の文字を前置/付加すると、値はテキストとして認識され、変換されません。印刷されない文字は、表示される値を変更しないので良いでしょう。ただし、プレーンな古いスペース文字(\ s、ASCII 32)は、Excelで切り取られてから値が変換されるため、機能しません。しかし、うまくいく他のさまざまな印刷および非印刷スペース文字があります。ただし、最も簡単なのは、単純なタブ文字(\ t、ASCII 9)を追加(後に追加)することです。
このアプローチの利点:
タブを使用したくない理由がある場合は、Unicodeテーブルで適切なものを探してください。
新しいMS Excelバージョンでインポートするために特定の形式も受け入れられ、.XLS形式と同様の多くのオプションを許可するXMLファイルを生成することになるかもしれませんが、これについての経験はありません。
したがって、さまざまなオプションがあります。要件/アプリケーションによっては、一方が他方よりも優れている場合があります。
MS Excelの新しいバージョン(2013以降)では、CSVをスプレッドシート形式で開くことができなくなりました。ワークフローのスピードバンプが1つ増えるため、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」以外の名前を付ける柔軟性がある場合は、「Myfile.txt」や「Myfile.csv.txt」などの「.txt」拡張子を付けてファイルに名前を付けることができます。次に、Excelで(ドラッグアンドドロップではなく、[ファイル]→[開く]または[最近使用したファイル]リストを使用して)開くと、「テキストインポートウィザード」が表示されます。
ウィザードの最初のページで、ファイルタイプとして[区切り]を選択します。
ウィザードの2ページ目で、区切り文字として「、」を選択し、値を引用符で囲んでいる場合はテキスト修飾子も選択します
3番目のページで、すべての列を個別に選択し、それぞれに「一般」ではなく「テキスト」タイプを割り当てて、Excelがデータを乱用しないようにします。
これがあなたまたは同様の問題を抱えている誰かの役に立つことを願っています!
警告:Excel '07には(少なくとも)バグがあります。フィールドのコンテンツにカンマがある場合、= "フィールド、コンテンツ"を正しく解析せず、カンマの後のすべてをカンマに入れます。引用符に関係なく、次のフィールド。
私が見つけた唯一の回避策は、フィールドの内容にカンマが含まれている場合に=を削除することです。
これは、Excelで正確に「正しい」と表現できないフィールドがあることを意味しているかもしれませんが、今では誰も驚かないと信じています。
field, content
が"
中にある場合、これは機能しません。例"=""field, co""ntent"""
""""
ます。
1"2
、場合、あなたは(同じようになり、それを残すとは対照的に、このトリックを使用することを選択した"1""2"
ファイルの中- Excelがすでにテキストとしてで扱われているでしょう)、その後、エクセル標的CSVファイルの最後の正しい文字列が終わりますであること"=""1""""2"""
。
C#でCSVファイルに書き込む文字列を作成しているときに、次のようにフォーマットする必要がありました。
"=\"" + myVariable + "\""
2018年
私のために(そしてCSVを変更することなく)機能した唯一の適切な解決策。
Excel 2010:
Excel office365:(クライアントバージョン)
注: Excel office365(webバージョン)、私がこれを書いているので、あなたはそれを行うことができません。
Excel 2010で新しいシートを開きます。データリボンの[テキストから外部データを取得]をクリックします。CSVファイルを選択して、[開く]をクリックします。「次へ」をクリックします。「タブ」のチェックを外し、「カンマ」の隣にチェックマークを入れ、「次へ」をクリックします。最初の列の任意の場所をクリックします。Shiftキーを押したまま、最後の列をクリックできるまでスライダーをドラッグし、Shiftキーを離します。[テキスト]ラジオボタンをクリックし、[完了]をクリックします
すべての列は、CSVファイルと同じようにテキストとしてインポートされます。
Microsoft Office 2016リリースの問題はまだ残っており、MARC1、MARCH1、SEPT1などの遺伝子名を操作している私たちにとってはやや不安になります。次に、Excelユーザーで開いたり、共有したりします。
HTH
最初にcsvファイルを生成するときにここで使用する簡単な方法は次のとおりです。値が少し変更されるため、すべてのアプリケーションに適しているわけではありません。
csvのすべての値の前にスペースを追加します
このスペースは、「1」、「2.3」、「-2.9e4」などの数値からExcelによって取り除かれますが、「01/10/1993」などの日付と「TRUE」などのブール値のままであり、変換されなくなります。 Excelの内部データ型。
また、読み込み時に二重引用符がザッピングされるのを防ぐため、csv内のテキストをExcelで変更せずに確実に維持する方法は、「3.1415」のようなテキストが二重引用符で囲まれ、文字列全体にスペースが前置されている場合でも、つまり、(「一重引用符を使用して入力する内容を示す」)「 "3.1415"」その後、Excelでは常に二重の引用符で囲まれ、先頭にスペースが追加されるため、元の文字列が使用されるため、数式などの文字列を考慮する必要があります。
"\xA0"
代わりに非改行スペースを使用できます。これでうまくいきます。
これは、ファイル自体に手を加えずにこれを実現する方法を知っている唯一の方法です。Excelでいつものように、私は何時間も机の上で頭を叩くことによってこれを学びました。
.csvファイル拡張子を.txtに変更します。これにより、Excelを開いたときにファイルが自動変換されなくなります。Excelを開いて空白のワークシートを開き、空白のシートを閉じてから、[ファイル] => [開く]で、拡張子が.txtのファイルを選択します。これにより、Excelは「テキストインポートウィザード」を強制的に開き、ファイルの解釈方法について質問されます。最初に区切り文字(カンマ、タブなど)を選択し、次に(ここで重要な部分です)列のセット列を選択して、フォーマットを選択します。ファイルの内容を正確に知りたい場合は、[テキスト]を選択すると、区切り文字の間にあるものが表示されます。
awk
である日付のような値の再フォーマットを回避する上で私にとってはうまくいきました。よりawk
、質問のタイトルにもかかわらず。
この同じ問題に対して私が行ったのは、Excelでファイルを開く前に、各csv値の前に "=" ""と各CSV値の後に1つの二重引用符を追加することです。たとえば、次の値を取ります。
012345,00198475
これらは、Excelで開く前に次のように変更する必要があります。
"="""012345","="""00198475"
これを実行すると、すべてのセル値はExcelで数式として表示されるため、数値や日付などの形式にはなりません。たとえば、012345の値は次のように表示されます。
="012345"
1234500198475E-8
です。この方法では、Excelでさらに計算を行うことができます。
ここで提供されるソリューションはどれも良いソリューションではありません。個々のケースで機能する場合がありますが、最終的な表示を制御できる場合のみです。私の例を挙げましょう。私の仕事では、小売用に販売する製品のリストを作成しています。これはCSV形式であり、パーツコードが含まれています。一部はゼロから始まり、製造元によって設定されています(当社の管理下にはありません)。先頭のゼロを削除すると、実際に別の製品と一致する可能性があります。小売業者のお客様は、バックエンド処理プログラムのためにCSV形式のリストを必要としています。これも制御不能であり、お客様ごとに異なるため、CSVファイルの形式を変更することはできません。接頭辞「=」も追加されたタブもありません。未加工のCSVファイルのデータは正しいです。問題は、お客様がExcelでそれらのファイルを開いたときです。そして、多くの顧客は実際にはコンピュータに精通していません。メールの添付ファイルを開いて保存するだけです。2つのわずかに異なる形式でデータを提供することを考えています。1つはExcelフレンドリー(TABを追加して上記のオプションを使用する方法、もう1つは「マスター」として使用する方法)です。私たちはこれを行う必要があります。その間、スプレッドシートに「誤った」データが表示されることがある理由を説明し続けます。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はそれをテキストとして認識します。
したがって、以下のコードを使用して.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データを変更するよりも便利です。アンディベアードとリチャードは、この方法を回避できましたが、いくつかの重要なステップを逃しました。
これが古いスレッドであることを知っています。私のように、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でサポートされていますが、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" ";"
上記のコードをそのまま使用できます。CSVをExcelに変換する必要があります。パスをcsvと下部の区切り文字に変更するだけです。
私の場合、Rを使用して生成されたcsvファイルの「Sept8」は、Excel 2013によって「8-Sept」に変換されました。この問題は、xlsxパッケージのwrite.xlsx2()関数を使用してxlsx形式の出力ファイルを生成することで解決しました不要な変換なしにExcelで読み込むことができます。したがって、csvファイルが提供されている場合は、それをRにロードして、write.xlsx2()関数を使用してxlsxに変換することができます。
Googleドライブ(Macの場合はNumbers)を使用した回避策:
または、手順3でMacを使用している場合は、Numbersでデータを開くことができます。
この問題はMac Office 2011とOffice 2013にも存在しますが、発生を防ぐことはできません。とても基本的なことのようです。
私の場合、CSV内で「1-2」や「7-12」などの値が逆コンマで囲まれていると、Excel内の日付に自動的に変換されます。その後、プレーンテキストだけに変換すると、 43768などの日付の数値表現。さらに、バーコードやEAN番号で見つかった大きな数値を、再度変換できない123E +数値に再フォーマットします。
GoogleドライブのGoogleスプレッドシートでは、数値が日付に変換されないことがわかりました。バーコードには3文字ごとにコンマが含まれていますが、これらは簡単に削除されます。特にMAC / Windows CSVを扱う場合、CSVを非常にうまく処理します。
誰かをいつか救うかもしれない。
私は、科学表記に変換し続けるクレジットカード番号に対してこれを行います。結局、.csvをGoogleスプレッドシートにインポートします。インポートオプションで、数値の自動フォーマットを無効にできるようになりました。機密性の高い列をプレーンテキストに設定し、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解決策を見たことがありません。このコードは、データを元の形式で保持します。