我有空格分隔值的字符串,我想从某个索引到另一个索引并将其保存在变量中。字符串如下:
John Doe Villa Grazia 323334I
我设法使用:
存储身份证(第3栏)if (line.length > 39)
{
idCard = line.Substring(39, 46);
}
但是,如果我用Substring存储名称和地址(第1列和第2列),则会有空格,因为它们的长度不同(与id卡不同)。如何存储这两个值并删除不必要的空格但允许名称和姓氏之间的空格?
答案 0 :(得分:4)
试试这个:
string line = " John Doe Villa Grazia 323334I";
string name = line.Substring(02, 16).Trim();
string address = line.Substring(18, 23).Trim();
string id = line.Substring(41, 07).Trim();
答案 1 :(得分:3)
var values = line.Split(' ');
string name = values[0] + " " + values[1];
string idCard = values[4];
如果在前面的列中没有确定的空格,则无法在名称上进行数据库查找。
答案 2 :(得分:2)
这些实际上是空格分隔还是真正修复宽度列?
我的意思是说“列”在每种情况下从字符串的相同索引开始 - 从你描述数据的方式听起来像是后者,即ID列始终是第39列的7个字符。
在这种情况下,您需要a)使用适当的子字符串调用来拉取列,然后使用“string”.Trim()来剪切空格。
如果行似乎是固定的,那么你根本就不想使用Split。
答案 3 :(得分:1)
如果前面的所有内容都是可变长度的话,你怎么能得到这样的ID呢?如果那用于我的名字,“David Hedlund 323334I”,则ID将从pos 14开始,而不是39.
尝试这种更具动态性的方法:
var name = str.Substring(0, str.LastIndexOf(" "));
var id = str.Substring(str.LastIndexOf(" ")+1);
答案 4 :(得分:1)
看起来你的解析策略会给你带来很多麻烦。你不应该依赖字符串的大小来解析它。
为什么不以CSV格式保存数据(John Doe,Villa Grazia,323334I)? 这样,您可以假设每个“列”将用逗号分隔,这将使您的解析工作更轻松。
答案 5 :(得分:1)
可能“DOH!”问题,但你确定它们是空格而不是标签吗?看起来它“可能”是一个标签分隔文件?
同样对于眉点,你应该使用String.Empty代替''来进行比较,它显然更具本地化和内存友好性。
答案 6 :(得分:0)
第一种方法 - 如前所述 - 是一种类似CSV的结构,其定义的标记为字段分隔符。
第二个是固定的字段长度,因此您知道第一列从char 1到char 20,第二列从char 21到char 30,依此类推。 这个概念没有什么不好,除非人的可读性可能很差,如果列填充到最大值,所以它们之间没有空间。
您可以编写一个帮助函数或类,它知道字段长度并提供对特定列的基于索引的容错访问。此函数将提取特定的字符串部分并删除前导和尾随空格,但将空格保留在它们之间。
答案 7 :(得分:0)
如果您的值具有固定宽度,最好不要拆分它,而是使用数组中的正确索引。
const string input = "John Doe Villa Grazia 323334I";
var name = input.Substring(0, 15).TrimEnd();
var place = input.Substring(16, 38).TrimEnd();
var cardId = input.Substring(39).TrimEnd();
假设您的值不能包含两个连续的空格,我们可以使用“”(双空格“作为分隔符?
以下代码将根据双空格
const string input = "John Doe Villa Grazia 323334I";
var entries = input.Split(new[]{" "}, StringSplitOptions.RemoveEmptyEntries)
.Select(s=>s.Trim()).ToArray();
string name = entries[0];
string place = entries[1];
string idCard = entries[2];