- つる
- ベテラン
- 会議室デビュー日: 2004/06/02
- 投稿数: 81
|
投稿日時: 2004-07-21 13:58
お世話になりまくってます。
あ,000,0 というカンマ区切りのCSVがあります。
これをエクセルで読み込むと、あ 0 0 となりますよね。
"あ","000",0とすれば、あ 000 0 と表示されるようになると思います。
で、ドットネットでは、これをどのように行うのか検討つきません。
vb6では、以下のコードで実現できていました。
Dim FileNum%
Dim a As String, b As String, c As Long
a = "あ" : b = "000" : c = 0
FileNum% = FreeFile
Open "d:\test.csv" For Output As FileNum%
Write #FileNum%, a, b, c
Close FileNum%
ドットネットで、
sw = New StreamWriter(SFD1.FileName, False, System.Text.Encoding.GetEncoding("Shift_JIS"))
sw.Write(""" & a & """ & ",")
sw.Write(""" & b & """ & ",")
sw.Write(c & ",")
sw.Write(vbCrLf)
や、
strSw = strSw & """ & a & """ & "," & """ & b & """ & "," & c
sw.WriteLine(strSw)
などと、色々とやってみましたが、駄目でした。
streamWriterのwritelineやwriteで実現できるのでしょうか?
どうかご教授ください。よろしくお願いします。
|
- ぢゃん♪
- 大ベテラン
- 会議室デビュー日: 2003/06/12
- 投稿数: 208
- お住まい・勤務地: 都内
|
投稿日時: 2004-07-21 14:14
引用: |
|
コード: |
|
sw.Write(""" & a & """ & ",")
sw.Write(""" & b & """ & ",")
|
|
ならコード: |
|
sw.Write("""" & a & """" & ",")
sw.Write("""" & b & """" & ",")
|
引用: |
|
コード: |
|
strSw = strSw & """ & a & """ & "," & """ & b & """ & "," & c
|
|
ならコード: |
|
strSw = strSw & """" & a & """" & "," & """" & b & """" & "," & c
|
です。文字列中のダブルコーテーションは、VB.NETでもVB6でも「""」と2つ重ねないと……。
それと、本筋とは関係ありませんが……。
引用: |
|
あ,000,0 というカンマ区切りのCSVがあります。
これをエクセルで読み込むと、あ 0 0 となりますよね。
"あ","000",0とすれば、あ 000 0 と表示されるようになると思います。
|
「"あ","000",0」もExcelで開けば「あ 0 0」となります。
|
- soluna
- ベテラン
- 会議室デビュー日: 2004/06/15
- 投稿数: 59
|
投稿日時: 2004-07-21 14:16
答えでなくてごめん。
その前の認識に問題があるので一言。
[quote]つるさんの書き込み (2004-07-21 13:58) より:
あ,000,0 というカンマ区切りのCSVがあります。
これをエクセルで読み込むと、あ 0 0 となりますよね。
"あ","000",0とすれば、あ 000 0 と表示されるようになると思います。
[quote]
実際にやってみれば分かりますが、なりません。
ExcelでCSVファイルを読み込むときの困った問題の一つです。
後、細かいことですが、全角と半角はちゃんと意識して下さいね。
|
- つる
- ベテラン
- 会議室デビュー日: 2004/06/02
- 投稿数: 81
|
投稿日時: 2004-07-21 14:31
すいません。ありがとうございます。
ならないですね。認識に問題ありです。
過去になった記憶があった為、確認もせずに書いてしまいました。
なんか別のアクションをしてたのかも・・・恥ずかしい限りです。
ぢゃん♪さんありがとうございます。できました。
しかも、「色々とやってみた・・」と言っておきながら、こんなに簡単な事を試してなかった。
VB6でも、この書き方で出力したことも過去にはあったはずなんです。(私の中で・・・)
本当にすいませんでした。以後、気をつけます。
今後ともよろしくお願いします。
|
- あみゅせる
- 常連さん
- 会議室デビュー日: 2004/07/08
- 投稿数: 33
- お住まい・勤務地: 神奈川県
|
投稿日時: 2004-07-21 14:43
こんにちは。
手元のバージョンはExcel2002です。
[CSV]
あ,="000",0
[/CSV]
用途によっては完全ではないですが、
少なくとも表示上は達成します。
_________________
|
- MMX
- ぬし
- 会議室デビュー日: 2001/10/26
- 投稿数: 861
|
投稿日時: 2004-07-21 15:43
あ,="000",0
表計算式(カンマを含まない)なのですね。
CSVでの数値の扱いはOffice(数値パースして最簡約な形)
とCOBOL方面(桁数や小数点の保存)
の違いがあるので神経を使います。
|
- Jitta
- ぬし
- 会議室デビュー日: 2002/07/05
- 投稿数: 6267
- お住まい・勤務地: 兵庫県・海手
|
投稿日時: 2004-07-21 17:08
書き出しなら。。。
項目を走査し、"を""に置き換える
項目全体を"で囲む
項目と項目の区切りを,にして吐き出す
読み込みはやっかいで、
while (ファイルの終わりでない)
1文字読み込む
if 読み込んだ文字が" then
1文字読み込む
if 次の文字も" then
項目 += "
else
1文字もどす
文字列フラグを反転
end if
else if (読み込んだ文字が,または改行)かつ文字列フラグがfalse then
項目をリストに追加
項目をクリア
else
項目 += 読み込んだ文字
end if
end while
if 項目がクリアでなければ then
項目をリストに追加
end if
こんな感じだったかな?
読み込んだものを数字として扱うか、文字列として扱うかは、読み込んだアプリケーション特有の処理なので、ここでは考えていません。
|
- Jubei
- ぬし
- 会議室デビュー日: 2002/03/02
- 投稿数: 830
- お住まい・勤務地: 関西
|
投稿日時: 2004-07-22 06:30
諸農です。
ずいぶん前に作ったCSVを扱うクラスです。
C#で記述していますが参考になるかもしれません。
コード: |
|
using System;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Specialized;
namespace CSVClass
{
public interface ICsv : IList
{
char Quoted
{
get;
set;
}
char Delimiter
{
get;
set;
}
string CommaStr
{
get;
set;
}
}
public class CommaString : StringCollection, ICsv
{
protected char _q = '"';
protected char _d = ',';
public string CommaStr
{
get {return getCommaStr();}
set {setCommaStr(value);}
}
public char Quoted
{
get {return _q;}
set {_q = value;}
}
public char Delimiter
{
get {return _d;}
set {_d = value;}
}
new public string this[int index]
{
get {return base[index];}
set {base[index] = value;}
}
private string getCommaStr()
{
StringBuilder sb = new StringBuilder();
foreach(string s in this)
{
sb.Append(_q);
sb.Append(s);
sb.Append(_q);
sb.Append(_d);
}
return sb.Remove(sb.Length-1,1).ToString();
}
private void setCommaStr(string ACommaStr)
{
this.Clear();
if (ACommaStr.Length == 0)return;
StringBuilder sb = new StringBuilder(ACommaStr);
int i = 0;
string s = "";
while (true)
{
if (i == sb.Length)
{
s = sb.ToString();
base.Add(s);
break;
}
if (sb[i] == _d)
{
if (i == 0) s = "";
else
{
if (sb[0] == _q)
{
if (sb[i-1] == _q)
{
s = sb.ToString().Substring(1,i-2);
}
else
{
i++;
continue;
}
}
else s = sb.ToString().Substring(0,i);
}
sb.Remove(0,i+1);
base.Add(s);
i = 0;
}
else i++;
}
}
}
class CommaStrEnumerator: IEnumerator
{
int _pos;
StringCollection list = null;
public CommaStrEnumerator(StringCollection AList)
{
list = AList;
this.Reset();
}
public void Reset()
{
_pos = -1;
}
public object Current
{
get
{
ICsv cs = new CommaString();
cs.CommaStr = list[_pos];
return cs;
}
}
public bool MoveNext()
{
if (_pos >= list.Count-1) return false;
_pos++;
return true;
}
}
public class CSV : CommaString, IEnumerable
{
new public IEnumerator GetEnumerator()
{
return new CommaStrEnumerator(this);
}
new public ICsv this[int Row]
{
get
{
CommaString cs = new CommaString();
cs.Delimiter = _d;
cs.Quoted = _q;
cs.CommaStr = base[Row];
return cs;
}
set
{
base[Row] = value.CommaStr;
}
}
public string this[int Row,int Col]
{
get
{
return getCommaField(base[Row],Col);
}
set
{
base[Row] = setCommaField(base[Row],value,Col);
}
}
public CSV():base()
{
}
public void LoadFile(string AFileName)
{
this.LoadFile(AFileName,Encoding.Default);
}
public void LoadFile(string AFileName,Encoding AEncoding)
{
using (FileStream fs = new FileStream(AFileName,FileMode.Open))
{
using (StreamReader sr = new StreamReader(fs,AEncoding))
{
string str;
while ((str = sr.ReadLine()) != null)
{
base.Add(str);
}
}
}
}
public void SaveFile(string AFileName)
{
this.SaveFile(AFileName,Encoding.Default);
}
public void SaveFile(string AFileName,Encoding AEncoding)
{
using (FileStream fs = new FileStream(AFileName,FileMode.Create))
{
using (StreamWriter sw = new StreamWriter(fs,AEncoding))
{
foreach(string str in this)
{
sw.WriteLine(str);
}
}
}
}
public int AddField(int Row,string value)
{
ICsv c = new CommaString();
c.CommaStr = base[Row];
int ret = c.Add(value);
base[Row] = c.CommaStr;
return ret;
}
private string getCommaField(string ACommaStr,int Col)
{
ICsv c = new CommaString();
c.Delimiter = _d;
c.Quoted = _q;
c.CommaStr = ACommaStr;
return (string)c[Col];
}
private string setCommaField(string ACommaStr,string AValue,int Col)
{
ICsv c = new CommaString();
c.Delimiter = _d;
c.Quoted = _q;
c.CommaStr = ACommaStr;
if (c.Count > Col)
{
c[Col] = AValue;
return c.CommaStr;
}
else
{
throw new Exception("配列範囲外");
}
}
}
}
|
1行のカンマ文字列を作るのでしたらCommaStringクラスで
大丈夫だと思います。このクラスはStringCollectionを継
承しているので、カンマで括りたい項目をAdd()で追加していき、
最後にCommaStrプロパティで取り出せばカンマ文字列のできあがりです。
逆にカンマ文字列のアイテムにアクセスしたいのであれば、
CommaStrプロパティにカンマ文字列をセットした後に、
インデクサで各要素にアクセスすればフィールドが取り出せます。
CSVデータを扱う場合は、CSVクラスを使います。
このクラスはCSVデータを2次元データとして扱います。
ファイルの読み込みにはLoadFile、書き出しにはSaveFileを使います。
項目へのアクセスにはRow(行位置)Col(カラム位置)で行います。
このクラスは、DelphiのVCLのTStringListを組み合わせた考えを模倣
して作ったので、VCLを使っていた人には理解しやすいかもしれません(^^;
_________________ 諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005
十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
|