C # объединяет строки строк в группы по 3 - PullRequest
0 голосов
/ 21 мая 2018

У меня есть такая строка (включая новые строки)

A2,
10.22,
-57,
A,
10.23,
-68,
A2,
10.24,
-60,
LB,
10.25,
-62,

Я пытаюсь, чтобы эта строка выглядела так:

 A2,10.22,-57,
 A,10.23,-68,
 A2,10.24,-60,
 LB,10.25,-62,

Мне нужно присоединить строку в каждом3 строки, которые я пробовал:

int numLines = a.Split('\n').Length;
for (int i = 0; i < numLines; i += 3)
{
    richTextBox1.Text = a.Replace("\n", "");
}

Но это не работает для меня.Пожалуйста, помогите мне

Ответы [ 7 ]

0 голосов
/ 21 мая 2018

Я предполагаю, что ввод на самом деле происходит из файла здесь.

var file = //file path
var sb = new StringBuilder();
var lineNum = 1;
var output = string.Empty;

using (var reader = new StreamReader(file))
{
    while (!reader.EndOfStream)
    {
        var line = reader.ReadLine();
        if (lineNum % 3 == 0)
        {
            output += sb.ToString() + "\n";
            sb.Clear();
        }
        else
            sb.Append(line);

        lineNum++;
    }
}

richTextBox1.Text = output;
0 голосов
/ 21 мая 2018

попробуйте это работает

    private void button1_Click(object sender, EventArgs e)
{
    //put your string in a textxbox with multiline property set to true
    string[] s = textBox1.Text.Replace("\r", "").Replace("\n", "").Split(',');
    string r = "";
    for (int i = 0; i < s.Length; i++)
    {
        r = r + s[i] + ",";
        if ((i + 1) % 3 == 0)
            r = r + "+";
    }
    if (r.Substring(r.Length - 1, 1) == ",")
        r = r.Substring(0, r.Length - 1);
    if (r.Substring(r.Length - 1, 1) == "+")
        r = r.Substring(0, r.Length - 1);
    string[] finalArrayString = r.Trim().Split('+');

    //just for show the result
    textBox1.Text = "";
    for (int i = 0; i < finalArrayString.Length; i++)
        textBox1.Text = textBox1.Text + finalArrayString[i] + "\r\n";
}

надеюсь, это поможет вам

0 голосов
/ 21 мая 2018

Вы также можете приблизиться к этому с помощью LINQ, используя перегрузку индекса , равную .Select, чтобы сохранить счетчик количества номеров строк, а затем сгруппировать их в группы по 3 - я использовалцелочисленное деление на Floor строковый индекс, 3 за раз, но, вероятно, есть и другие подходящие способы.

var groups = values.Select((s, idx) => (Index: idx / 3, Value: s))
    .GroupBy(x => x.Index);

Где каждый элемент в вышеуказанных группах будет IEnumerable<(Index, Value)>.

Вам также нужно быть осторожным с символами новой строки - в Windows это может быть \r\n, а не только указанный вами \n.

Вот пример:

var a =
@"A2,
10.22,
-57,
A,
10.23,
-68,
A2,
10.24,
-60,
LB,
10.25,
-62,";

var values = a.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
var groups = values.Select((s, idx) => (Index: idx / 3, Value: s))
    .GroupBy(x => x.Index);

foreach (var grp in groups)
{
    Console.WriteLine(string.Join("", grp.Select(x => x.Value)));
}

Поскольку у вас уже есть запятые в конце каждой строки (включая последнюю), нет необходимости добавлять еще один разделитель.

Вывод:

A2,10.22,-57,
A,10.23,-68,
A2,10.24,-60,
LB,10.25,-62,
0 голосов
/ 21 мая 2018
static void Main(string[] args)
    {            
        var Lines = System.IO.File.ReadAllLines("input.txt");
        var Result = new StringBuilder();
        var SB = new StringBuilder();

        for (var i = 0; i < Lines.Length; i++)
        {
            SB.Append(Lines[i]);

            if ((i+1) % 3 == 0)
            {
                Result.Append($"{SB.ToString()}{Environment.NewLine}");
                SB.Clear();
            }
        }

        System.IO.File.WriteAllText("output.txt", Result.ToString());

    }
0 голосов
/ 21 мая 2018

Попробуйте использовать Aggregate функцию

var outPutList = data.Replace("\r", string.Empty).Replace("\n", string.Empty).Split(",").Aggregate(new StringBuilder(""), (x, y) =>
{
    if (double.TryParse(y, out double parsedValue))
        x.Append(" " + parsedValue);
    else
    {
       x.Append(Environment.NewLine);
       x.Append(y.Trim());
    }
    return x;
});
  richTextBox1.Text = outPutList.ToString(); 

Вот вывод

enter image description here

0 голосов
/ 21 мая 2018

Попробуйте это решение, которое представляет собой комбинацию linq и for loop

var result = "";
var items = yourInputString.Split('\n');
for(var i=0; i<items.Count();i=i+3)
{
    result += string.Join(",",items.Skip(i).Take(3))+"\n";
}
0 голосов
/ 21 мая 2018

Почему бы не использовать массив, который вам дает разделение?

var newArr = a.Split('\n');

for (int i = 0; i < newArr.Length; i += 3)
{
    richTextBox1.Text = newArr[i] + newArr[i + 1] + newArr[i + 2];
}

Только не забудьте проверить длину массивов, чтобы не получить исключение IndexOutOfRange.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...