0

データの各ビットの間にコンマを入れて、リスト全体をテキスト ファイルにコーディングするにはどうすればよいですか? 現在、ファイルnewDataを作成していますが、リストから変数を入れていません。これが私がこれまでに持っているものです。

public partial class Form1 : Form {
  List<string> newData = new List<string>();
}

上記は、リストを作成する場所です。以下は私がそれを読んでいるところです。

private void saveToolStripMenuItem_Click(object sender, EventArgs e) {
  TextWriter tw = new StreamWriter("NewData.txt");
  tw.WriteLine(newData);
  buttonSave.Enabled = true;
  textBoxLatitude.Enabled = false;
  textBoxLongtitude.Enabled = false;
  textBoxElevation.Enabled = false;
}

以下は、変数がどこから来ているかです。

private void buttonSave_Click(object sender, EventArgs e) {
  newData.Add (textBoxLatitude.Text);
  newData.Add (textBoxLongtitude.Text);
  newData.Add (textBoxElevation.Text);
  textBoxLatitude.Text = null;
  textBoxLongtitude.Text = null;
  textBoxElevation.Text = null;
}
4

5 に答える 5

4

他の人が述べているようにあなたは使うことができますがString.Join、彼らは3つの重要なことを無視しています:

  • あなたが本当にやろうとしているのは、コンマ区切りの値ファイルを書くことです。
  • 受信している入力と、カンマが含まれるかどうか
  • 入力をサニタイズする場合、ファイルに書き出すときのスレッドの現在の文化は何ですか

カンマ区切りのファイルを作成します。このための標準化された形式はありませんが、特にユーザー入力を取得する場合は、文字列の内容に注意する必要があります。次の入力を検討してください。

latitude = "39,41"
longitude = "41,20"

カンマが小数点記号として使用されている国はたくさんあるので、アプリケーションの配布方法によっては、この種の入力が非常に可能です(個人的には、これがWebサイトであるかどうかはさらに心配です)。

また、標高を取得する場合、千単位の区切り文字としてコンマを使用する他のほとんどの場所で絶対に可能です。

elevation = 20,000

他のすべての回答では、ファイル内の行の出力は次のようになります。

39,41,41,20,20,000

これを解析すると(解析されると仮定すると、機械可読形式を作成している)、失敗します。

あなたがしたいのは、最初にコンテンツを小数に解析し、次にそれを出力することです。

次のように入力をサニタイズすると仮定します。

decimal latitude = Decimal.Parse(textBoxLatitude.Text);
decimal longitude = Decimal.Parse(textBoxLongitude.Text);
decimal elevation = Decimal.Parse(textBoxElevation.Text);

次に、コンマがないように値をフォーマットします(必要な場合)。

そのためには、専用のCSVライター/パーサーを使用することを強くお勧めします(必要に応じてNuGetなどでServiceStackのシリアライザーを試してください)。これは、コンマで区切ってコンテンツ内のコンマを考慮します。

于 2012-11-28T17:53:34.067 に答える
4
 private void saveToolStripMenuItem_Click(object sender, EventArgs e)
    {

        TextWriter tw = new StreamWriter("NewData.txt");                       
        tw.WriteLine(String.Join(", ", newData));

        // Add appropriate error detection
    }

両方の主な回答スレッドでの議論に応えて、CSV 出力を処理するためのより堅牢な方法の古いコードの例を次に示します。

上記は構文をチェックしていませんが、重要な概念はString.Join.

 public const string Quote = "\"";

 public static void EmitCsvLine(TextWriter report, IList<string> values)
    {
        List<string> csv = new List<string>(values.Count);

        for (var z = 0; z < values.Count; z += 1)
        {
            csv.Add(Quote + values[z].Replace(Quote, Quote + Quote) + Quote);
        }

        string line = String.Join(",", csv);

        report.WriteLine(line);
    }

これは、 を使用してもう少し一般化することもできますがIEnumerable<object>、この形式のコードでは、その必要はありませんでした。

于 2012-11-28T17:46:01.967 に答える
0
You cannot output the list just by calling tw.WriteLine(newData);

しかし、このようなものはそれを達成します:

tw.WriteLine(string.Join(", ", newData));
于 2012-11-28T17:46:56.517 に答える
-1

他のユーザーが提案したように、リストを反復する (テストされていない) か、string.Join を使用する必要があります (リストを配列に変換する必要があります)。

private void saveToolStripMenuItem_Click(object sender, EventArgs e)
    {
        TextWriter tw = new StreamWriter("NewData.txt");
        for (int i = 0; i < newData.Count; i++) 
        {                   
           tw.Write(newData[i]);
           if(i < newData.Count-1)
           { 
              tw.Write(",");
           }
        }
        tw.close();
        buttonSave.Enabled = true;
        textBoxLatitude.Enabled = false;
        textBoxLongtitude.Enabled = false;
        textBoxElevation.Enabled = false;

    }
于 2012-11-28T17:49:58.017 に答える
-1

あなたは出来る:

StringBuilder b = new StringBuilder();
foreach (string s in yourList)
{
    b.Append(s);
            b.Append(", ");
}

string dir = "c:\mypath";
File.WriteAllText(dir, b.ToString());
于 2012-11-28T17:49:10.700 に答える