我想分割一个已经拆分的字符串

时间:2017-01-09 22:19:42

标签: c#

嘿大家我希望你能解决我的小问题。我想拆分一个已经拆分的字符串,但是我得到了错误:"索引超出了数组的范围"。

我知道我的阵列太小但我不知道在这种情况下如何增加它。这是代码。

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

namespace Reserveringssysteem
{
    public partial class Form2 : Form
    {
        public string naam;
        public string adres;
        public string datum;
        public int kamernr;
        public int id;
        public int indexnr;
        public int indexnrb;
        public int indexnrc;

        Kamer[] reserveringArray = new Kamer[6];
        public Form2()
        {
            InitializeComponent();
        }

        private void backbtn_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            using (StreamReader sr = new StreamReader(@"C:\Users\Gebruiker\Desktop\OIS\Hotelsysteem\Reserveringen.txt", Encoding.Default))
            {
                string text = sr.ReadToEnd();
                string[] lines = text.Split(';');
                foreach (string s in lines)
                {
                    id = Convert.ToInt32(s.Split(':')[0]);
                    indexnr = s.IndexOf(':');
                    naam = s.Split('/')[indexnr];
                    indexnra = s.IndexOf("/");
                    adres = s.Split('<')[indexnra];
                    indexnrb = s.IndexOf('<');
                    kamernr = Convert.ToInt32(s.Split('>')[indexnrb]);
                    indexnrc = s.IndexOf('>');
                    datum = s.Split(';')[indexnrc];
                    ListViewItem opbouwera = new ListViewItem(Convert.ToString(id));
                    opbouwera.SubItems.Add(naam);
                    opbouwera.SubItems.Add(adres);
                    opbouwera.SubItems.Add(Convert.ToString(kamernr));
                    opbouwera.SubItems.Add(datum);
                    reserveringlistview.Items.Add(opbouwera);
                }


            }
        }
    }
}

从我开始使用indexnra时开始出现问题。我希望你们其中一个人可以帮助我。

2 个答案:

答案 0 :(得分:2)

这些行就是问题的一个例子:

indexnr = s.IndexOf(':');
naam = s.Split('/')[indexnr];

IndexOf将返回:字符的字符串中的位置(例如9,如果冒号是第10个字符,因为索引是从零开始的。)

s.Split('/')将返回一个字符串数组,因此在该示例中,如果对indexnr使用值9,则会要求输入第10个字符串。

所有这些都表示IndexOf的输出很可能不是调用Split后用于查找特定字符串的适当索引。

从您的代码中不清楚您的预期输出是什么 - 如果您添加示例输入和预期输出,您可能会获得更好的方法来获取所需内容。

答案 1 :(得分:2)

我会使用正则表达式来解析行中的数据。因为它描述了输入字符串的布局,而不是使用某些分隔符的子字符串和索引。另外,我会使用自定义对象将人员数据存储在命名良好的字段中:

public class Person
{
    public int Id {get;set;}
    public string Name {get;set;}
    public string Address {get;set;}
    public string Appartment {get;set;}
    public DateTime Date {get;set;}
}

这里是正则表达式,它为输入字符串中的每个数据部分定义组:

  • (?<id>\d+)第一组是 id - 数字序列
  • :然后带有一些空格的分隔符
  • (?<name>[\w\s]+)由字母和空格组成的名称
  • /秒分隔符
  • (?<address>[\w\d\s]+)地址 - 字母,数字,空格
  • <\s*(?<app>\d+)\s*>公寓号码 - 尖括号中的数字
  • \s+一些空格
  • (?<date>\d{4}-\d{2}-\d{2})以yyyy-dd-MM格式约会

用法:

var regex = new Regex(@"(?<id>\d+):(?<name>[\w\s]+)/(?<address>[\w\d\s]+)<\s*(?<app>\d+)\s*>\s*(?<date>\d{4}-\d{2}-\d{2})");
var people = from line in lines
             let match = regex.Match(line)
             where match.Success
             select new Person {
                 Id = Int32.Parse(match.Groups["id"].Value),
                 Name = match.Groups["name"].Value.Trim(),
                 Address = match.Groups["address"].Value.Trim(),
                 Appartment = match.Groups["app"].Value,
                 Date = DateTime.ParseExact(match.Groups["date"].Value.Trim(),"yyyy-dd-MM",null)
             };

对于此示例文件

  

1:Jeroen Wasser Poppy Paashaas / Bijloopstraat 21&lt; 5个2017-31-12; 2:   Bob White / Bijloopstraat 22&lt; 15 - ; 2016-28-10;

您将解析两个人:

[
  {
    "Id": 1,
    "Name": "Jeroen Wasser Poppy Paashaas",
    "Address": "Bijloopstraat 21",
    "Appartment": "5",
    "Date": "2017-12-31T00:00:00"
  },
  {
    "Id": 2,
    "Name": "Bob White",
    "Address": "Bijloopstraat 22",
    "Appartment": "15",
    "Date": "2016-10-28T00:00:00"
  }
]

然后抓取人员集合并在ListView中显示它们。即使用演示文稿(在UI上显示数据)单独访问数据(读取文件和解析人员)。

注意:您还可以在正则表达式中使用未命名的组。它的可读性会降低,但更紧凑:

(\d+):([\w\s]+)/([\w\d\s]+)<\s*(\d+)\s*>\s*(\d{4}-\d{2}-\d{2})

您必须按索引而不是名称

读取组
Id = Int32.Parse(match.Groups[1].Value),