public class myRows
{
public decimal Number1 { get; set; }
public decimal Number2 { get; set; }
public decimal Number3 { get; set; }
public decimal Number4 { get; set; }
public decimal Number5 { get; set; }
public decimal Number6 { get; set; }
public string Date1 { get; set; }
public myRows(string str)
{
Number1 = Convert.ToDecimal(str.Substring(3, 7));
Number2 = Convert.ToDecimal(str.Substring(15, 8));
Number3 = Convert.ToDecimal(str.Substring(24, 8));
Number4 = Convert.ToDecimal(str.Substring(36, 8));
Number5 = Convert.ToDecimal(str.Substring(47, 8));
Number6 = Convert.ToDecimal(str.Substring(58, 8));
Date1 = str.Substring(65, 25);
}
}
然后我读了像这样的文本文件数据
var myRows = new List<myRows>();
var myR = new StreamReader(txtFileToImport.Text);
while (!myR.EndOfStream)
{
string s = myR.ReadLine();
if (!String.IsNullOrEmpty(s.Trim()))
{
myRows.Add(new myRows(s));
}
}
myR.Close();
dataGridView1.DataSource = myRows;
我遇到的问题是预先确定文本文件中列值之间的空白的startIndex和长度,例如Convert.ToDecimal(str.Substring(3, 7));
列值之间的空格不均匀,第1列和第2列之间可以是5,第7列和第8列之间可以是8。
目前,我必须事先知道空白区域开始和结束的索引。有没有我可以动态获取白色空间的起始索引及其长度,而无需查看要处理的文本文件?
我真正需要的是传递给str.Substring(,)
的参数,而不是硬编码。
@Habib:示例文本文件在这里
答案 0 :(得分:1)
您可以在string
上使用string.Split(),然后使用数组索引而不是字符串位置来转换数字。在白色空间上拆分字符串将从字符串中删除空格。类似的东西:
public myRows(string str)
{
string[] splitArray = str.Split(); //split on white space
if(splitArray.Length > 7)
{
Number1 = Convert.ToDecimal(splitArray[0]);
//,....... So on
}
}
答案 1 :(得分:1)
使用String.Split
选项对空格字符使用StringSplitOptions.RemoveEmptyEntries
。这将有效地删除空字段,只留下包含数据的字段。
在line
中给出一行文本文件,您的代码将如下所示:
var fields = line.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var Number1 = Convert.ToDecimal(fields[0]);
var Number2 = Convert.ToDecimal(fields[1]);
// etc.
由于您的日期数据被分解为几个离散字段(星期几,月,日等),您将通过他们将占用的字段“重新组合”它们并分配给您的Date1
:< / p>
var Date1 = string.Format("{0} {1} {2} {3} {4}", fields[7], fields[8], fields[9], fields[10], fields[11]);
当然,在生产代码中,您需要验证一些事情:
Double.TryParse
)答案 2 :(得分:1)
使用Split
方法将您的行拆分为8个部分。最后一个将是你的约会。
var parts = line.Split(new char[]{' '}, 8, StringSplitOptions.RemoveEmptyEntries);
Number1 = Decimal.Parse(parts[0]);
Number2 = Decimal.Parse(parts[1]);
......
......
DateTime Date1 = DateTime.ParseExact(parts[7],"ddd MMM dd HH:mm:ss yyyy",CultureInfo.InvariantCulture);