1

以下のようなデータを含むテキストファイルがあるとします。最初の行を読み取り、要素を1つの配列に格納します。2番目の行を読み取り、2番目の配列に格納します。後で配列を操作します。C#でこれを行うのを手伝ってもらえますか?

入力テキストファイル:

5,7,3,6,9,8,3,5,7

5,6,8,3,4,5

6,4,3,2,65,8,6,3,3,5,7,4

4,5,6,78,9,4,2,5,6

私が試しているコードは次のとおりです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace ReadFile
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        static void Main(string[] args)
        {
            TextReader tr = new StreamReader("Data.txt");
            // write a line of text to the file
            string word = tr.ReadLine();
            //now split this line into words
            string[] val = word.Split(new Char[] { ',' });
        }
    }

}

上記の手法を使用すると、配列valの最初の行を取得できます。すべての行に対してループする方法はありますか?

4

7 に答える 7

4

File.ReadAllLinesは、ファイルからすべての行を文字列配列として読み取るのに役立ちます。
String.Splitは、行を分割するのに役立ちます。
Int.Parseは、文字列をintに変換するのに役立ちます(doubleにも同様のメソッドがあります)。

于 2012-07-17T06:50:43.530 に答える
1

さて、あなたは初心者なので、あなたの注意を集中させるための私の提案です。まず第一に、あなたの消費者は常にすべての回線を必要としていますか、それともある時点で停止できますか?その場合は、yield戦略を使用して、結果を1つずつ返します。いずれの場合も、 StreamReaderを使用して1行ずつ読み取り、文字列を区切り文字で分割した後、 double.TryParse(...)またはint.TryParse()を使用できます。セパレータは変更される可能性があることに注意してください。ある種の設定可能性で使用し、doubleの場合は、小数点が異なるマシンでもコードが機能することを確認してください。csv alwaisが小数点区切り文字として使用されていることが確実な場合は、次のように指定します'.'

double.TryParse("",System.Globalization.CultureInfo.InvariantCulture);
于 2012-07-17T07:02:57.373 に答える
0

私はそれを考え出した。お時間をいただき、ありがとうございました!

private void ReadFile()
    {
        var lines = File.ReadLines("Data.csv");
        var numbers = new List<List<double>>();
        var separators = new[] { ',', ' ' };
        /*System.Threading.Tasks.*/
        Parallel.ForEach(lines, line =>
        {
            var list = new List<double>();
            foreach (var s in line.Split(separators, StringSplitOptions.RemoveEmptyEntries))
            {
                double i;

                if (double.TryParse(s, out i))
                {
                    list.Add(i);
                }
            }

            lock (numbers)
            {
                numbers.Add(list);
            }
        });
于 2012-08-03T06:56:48.123 に答える
0

次のコード行を参照してください。

List<List<int>> numbers = new List<List<int>>();
foreach (string line in File.ReadAllLines(""))
{
    var list = new List<int>();
    foreach (string s in line.Split(new[]{',', ' '}, 
                                    StringSplitOptions.RemoveEmptyEntries))
    {
        int i;
        if(int.TryParse(s, out i))
        {
            list.Add(i);
        }
    }
    numbers.Add(list);
}

var specialNumber = numbers[3][4];        // gives line 3 number 4
var specialLine = numbers[2].ToArray();   //  gives an array of numbers of line 2

説明: 私はこの便利なジェネリックを使用しました:

  • List:インデックスでアクセスできるオブジェクトの強く型付けされたリストを表します

そしてこれらの便利なクラス:

  • File.ReadAllLines:テキストファイルを開き、ファイルのすべての行を文字列配列に読み込みます
  • String.Split:指定された文字列またはUnicode文字配列の要素で区切られたこのインスタンスのサブ文字列を含む文字列配列を返します。
  • Int.TryParse:数値の文字列表現を、同等の32ビット符号付き整数に変換します。
于 2012-07-17T06:48:15.353 に答える
0

これを試して

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;
using System.IO;
using System.Xml.Linq;
using System.Diagnostics;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {

            List<int[]> arrays = new List<int[]>();

            int counter = 0;
            string line;

            // Read the file
            System.IO.StreamReader file =
               new System.IO.StreamReader("c:\\temp\\test.txt");
            while ((line = file.ReadLine()) != null)
            {
                // split the line into a string array on , separator
                string[] splitLine = line.ToString().Split(',');

                // if our split isnt null and has a positive length
                if (splitLine != null && splitLine.Length > 0)
                {

                    // create a lineArray the same size as our new string[]
                    int[] lineArray = new int[splitLine.Length];

                    int posCounter = 0;

                    foreach (string splitValue in splitLine)
                    {
                        // loop through each value in the split, try and convert
                        // it into an int and push it into the array
                        try
                        {
                            lineArray[posCounter] = Int32.Parse(splitValue);
                        }
                        catch { }
                        posCounter++;
                    }

                    // if our lineArray has a positive length then at it to our
                    // list of arrays for processing later.
                    if (lineArray.Length > 0)
                    {
                        arrays.Add(lineArray);
                    }
                }
                counter++;
            }

            file.Close();

            // go through the List<int[]> and print to screen
            foreach (int[] row in arrays)
            {
                foreach (int rowCol in row)
                {
                    Console.Write(rowCol + ",");
                }
                Console.WriteLine();
            }

            // Suspend the screen.
            Console.ReadLine();
        }
    }
}
于 2012-07-17T06:53:39.410 に答える
0

大まかにこのようなものが機能します:

StreamReader reader = new (File.OpenRead(@"YourFile.txt"));
List<string> LstIntegers = new List<string>();

            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                //values is actually a string array.
                var values = line.Split(',');
                //add the entire array fetched into string List
        LstIntegers.AddRange(values);   
            }
          // important to close the reader. You can also use using statement for reader. It 
          // will close the reader automatically when reading finishes.
            reader.Close();

   // You can then further manipulate it like below, you can also use int.Parse or int.TryParse:
   foreach (var v in LstIntegers)
   {
      // use int.TryParse if there is a chance that a non-int is read.
      int someNum = Convert.ToInt32(v);

   }
于 2012-07-17T07:02:02.060 に答える
0

手順を示すために、次のコードを2つのセクションで示しました。

セクション1

このコードは、すべての行をループし、各行の文字列番号をリストに格納する必要があることを示すためのものです。

セクション1

static void Main(string[] args)
{
     List<string[]> allLines = new List<string[]>();

     TextReader tr = new StreamReader("Data.txt");
     string word = tr.ReadLine();

     // write a line of text to the file
     while ( word !=  null ) {

         //now split this line into words
         string[] vals = word.Split(new Char[] { ',' });

         //Add this line into allLines
         allLines.Add(vals);

         //Now read the next line
         word = tr.ReadLine();
     }
}

第2節

このセクションでは、結果をとして取得しますint

static void Main(string[] args)
{
     //A list of arrays of integers
     //A single array will have numbers from a single line
     List<int[]> allNumbers = new List<int[]>();

     TextReader tr = new StreamReader("Data.txt");
     string word = tr.ReadLine();

     // write a line of text to the file
     while ( word !=  null ) {

         //now split this line into words
         string[] vals = word.Split(new Char[] { ',' });
         int[] intVals = new int[vals.Length];

         for ( int i = 0; i < vals.Length; i++) {
             Int32.TryParse(vals[i], out intVals[i]);
         }

         //Add this array of integers into allNumbers
         allNumbers.Add(intVals);

         //Now read the next line
         word = tr.ReadLine();
     }
}

注:上記のコードをコンパイルまたはテストしていません。

于 2012-07-17T07:46:09.690 に答える