有没有办法将数组拆分为X大小的列表?

时间:2019-02-06 16:13:00

标签: c#

我正在读取包含数千个代码的文本文件,但是代码的顺序如下。

First line: NS10 EW9
Second line: $1.91
Third line: $2.60
Fourth line: 42

我正在尝试在新列表中将第一行分为两行。

我修改了代码,但仍然存在另一个错误。这是索引超出范围异常错误。

int size = FaresFile.Length / 4 * 5;
                int linecount = 0;
                String[] split = new string[size];
                conn.ConnectionString = "Data Source=***\\*** database=***; integrated security= true";
                do
                {
                    split = FaresFile[0].Split(' ');
                    cmd.CommandText = string.Format("INSERT INTO Fares Values ('{0}','{1}', '{2}', '{3}', '{4}' )", split[linecount], split[linecount + 1], split[linecount + 2], split[linecount + 3], split[linecount + 4]);
                    cmd.Connection = conn;
                    try
                    {
                        conn.Open();
                        cmd.ExecuteNonQuery();
                    }
                    catch (Exception ex)
                    {

                    }
                    finally
                    {
                        conn.Close();
                    }
                    linecount = linecount + 5;
                }while(linecount != split.Length);

我希望新列表看起来像这样。

First line: NS10
Second line: EW9
Third line: $1.91
Fourth line: $2.60
Fifth line: 42

我无法运行该程序,因为代码中有错误。

4 个答案:

答案 0 :(得分:0)

我认为最好是使用两个数组。一种带有源数据,另一种包含修改后的数据。

从“源”数组中读取第一行,将其分成两部分,然后放入“输出”数组中。然后将源arra的第二,第三,第四和第五行复制(追加)到输出数组。 源的第六行必须在输出数组中分为两行。然后复制(附加)第7、8,...

答案 1 :(得分:0)

我不确定FaresFile的格式,但这是一些对我有用的代码。 (\ n是换行符)似乎您想使用''而不是“”,以便将其从字面上解释为字符。

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static void Main()
    {
        string text = "NS10 EW9 \n $1.91 \n \n $2.60 \n 42";

        List<String> split = text.Split(' ').ToList();

        foreach(string item in split)
        {
            Console.WriteLine("List Item:" + item);
        }

    }
}

根据文件的格式,您可能需要删除空数组项。

答案 2 :(得分:0)

(在OP显着更改问题之前已回答)

我建议您采用以下方法读取整个文件并将其解析为一条语句,而不是只修正一条错误的行,以免循环:

using System.Linq;
using System.IO;

var allLines = File
    .ReadAllLines(filepath)
    .SelectMany(x => x.Split(new [] {' '}, StringSplitOptions.RemoveEmptyEntries))
    .ToList();

其中 filepath 是您的输入文件。

注意:

  • 。此处拆分使用''代替“”(可解决您的原始问题)
  • StringSplitOptions.RemoveEmptyEntries 可确保忽略多个连续空格和任何前导/后缀空格,而不是在输出中创建空白行

答案 3 :(得分:0)

string inputFile = "{filepath to your input file}";
using (var conn = new SqlConnection())
{
    conn.ConnectionString = "{your connection string}";
    conn.Open();
    File.ReadAllLines(inputFile)
        .SelectMany(l => l.Split(new[] { ' '}, StringSplitOptions.RemoveEmptyEntries))
        .Select(l => $"INSERT INTO Fares  Values ('{l}')")
        .ToList()
        .ForEach(c =>
        {
            using (var cmd = new SqlCommand(c, conn))
            {
                cmd.ExecuteNonQuery();
            }
        });
}

与您的代码的重要区别是:

  1. 一次插入一个SQL行。您试图一次插入5,但SQL语法不正确。我以为您正在尝试减少发出的SQL命令的总数,但这使问题更加混乱。首先使它正常工作。
  2. 使用LINQ使代码更简洁。
  3. 使用SelectMany()完成主要陈述的目标(在一行输入中处理多个令牌,就好像它们是单独的行一样)。 SelectMany()将多个集合拼合为一个集合。
  4. 使用“ using”语句,以便您免费关闭/处置SqlConnection和SqlCommand对象。
  5. 省去了中间的FaresFile字符串数组