如何从字符串中收集匹配值的数组?

时间:2019-01-28 10:02:45

标签: c# arrays .net

我正在将内存映射文件中的数据填充到类似这样的字符串中:

AAPL,2013-1-2
Open:79.117
Close:78.433
High:79.286
Low:77.376
Volume:139948984

AAPL,2013-1-3
Open:78.268
Close:77.442
High:78.524
Low:77.286
Volume:88114464

以此类推...

因此,现在我想对所有天数进行平仓。并且在内存映射文件和字符串中有数千天的数据收集。那么,如何获取封闭值并可以对其进行数组化呢?

我试图将其制成数组,但将整个数据制成单个数组。所以这不是我想要的。

string[] lines = System.IO.File.ReadAllLines(@"D:\mine.txt");
foreach (string line in lines)
{
    // Use a tab to indent each line of the file.
    Console.WriteLine("\t" + line);
}

byte[] bytes = new byte[10000000];
stream.ReadArray(0, bytes, 0, bytes.Length);
string txt = Encoding.UTF8.GetString(bytes).Trim('\0');`

因此,我需要一个所有接近值的数组才能从该字符串中获取。像这样:

{78.433, 77.442, etc..}

4 个答案:

答案 0 :(得分:3)

尝试一下:

decimal[] arrayOfCloses =
    File
        .ReadAllLines(@"D:\mine.txt")
        .Select(x => x.Split(':'))
        .Where(x => x.Length == 2)
        .Where(x => x[0] == "Close")
        .Select(x => decimal.Parse(x[1]))
        .ToArray();

答案 1 :(得分:1)

尝试一下:

File.ReadLines(@"D:\mine.txt")
  // Pick only those lines starting with "Close"
  .Where(line => line.StartsWith("Close:"))
  // Get value, which follows colon, and parse it do double
  .Select(line => double.Parse(line.Split(':')[1]))
  // Convert result to an array
  .ToArray();

答案 2 :(得分:0)

我认为您的文件是这样的:

AAPL,2013-1-2
Open:79.117
Close:78.433
High:79.286
Low:77.376
Volume:139948984
AAPL,2013-1-3
Open:78.268
Close:77.442
High:78.524
Low:77.286
Volume:88114464

尝试

   var lines = System.IO.File.ReadAllLines(@"C:\Users\bouyami\Documents\AB_ATELIER\1.txt").ToList();
        var linesFiltred = lines.Where(x => x.StartsWith("Close")).ToList();
        var result = linesFiltred.Select(x => x.Split(':')[1]).ToList();

答案 3 :(得分:-1)

尝试以下接受空白行的内容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;


namespace ConsoleApplication98
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
        static void Main(string[] args)
        {
            AAPL aapl = new AAPL(FILENAME);
        }
    }
    public class AAPL
    {
        static List<AAPL> aapls = new List<AAPL>();
        private DateTime date { get; set; }
        public decimal open { get; set; }
        public decimal close { get; set; }
        public decimal low { get; set; }
        public decimal high { get; set; }
        public int volume { get; set; }

        public AAPL() { }
        public AAPL(string filename)
        {
            StreamReader reader = new StreamReader(filename);
            string line = "";
            AAPL newAAPL = null;
            while ((line = reader.ReadLine()) != null)
            {
                line = line.Trim();

                if (line.Length > 0)
                {
                    if (line.StartsWith("AAPL"))
                    {
                        string dateStr = line.Substring(line.IndexOf(",") + 1);
                        date = DateTime.Parse(dateStr);
                        newAAPL = new AAPL();
                        aapls.Add(newAAPL);
                        newAAPL.date = date;
                    }
                    else
                    {
                        string[] splitArray = line.Split(new char[] { ':' });

                        switch (splitArray[0])
                        {
                            case "Open":
                                newAAPL.open = decimal.Parse(splitArray[1]);
                                break;

                            case "Close":
                                newAAPL.close = decimal.Parse(splitArray[1]);
                                break;

                            case "Low":
                                newAAPL.low = decimal.Parse(splitArray[1]);
                                break;

                            case "High":
                                newAAPL.high = decimal.Parse(splitArray[1]);
                                break;

                            case "Volume":
                                newAAPL.volume = int.Parse(splitArray[1]);
                                break;
                        }
                    }
                }
            }
        }


    }
}