我有一个字符串输出,如下所示:
ID = GC5c.U.feab4bc5-8-92e-c486eaddddf8
AESKEY1 = efbf5c9db259e345c205b0da27f6fb459D
AESKEY2 = ea85af9f1e5f42ff4fe8b9f07e7dcebc68
DESKEY1 = 6388a9e1a2fc8981189f0f412ae4e8
ID = JNPa.T.71664548-82-be2-a51aadd4a6f3
AESKEY1 = 37af9242c8879414e420f46903c16adebd3
AESKEY2 = 1259a1f6f6da03cb3984a117ca617d9ff73
DESKEY1 = 9547dc08db70cb95789f3a59e5c6adebd31
如何迭代此列表的ID并获取字符串中的值?
答案 0 :(得分:2)
打开文件,遍历每一行,并将其放入 <script type="text/javascript">
var map = null;
var spotsArray = [];
window.onload = initialize();
function initialize() {
map = new google.maps.Map(document.getElementById("map-canvas")
, {
mapTypeId: google.maps.MapTypeId.roadmap
, zoom: @Model.StartingZoom
, disableDefaultUI: true
, zoomControl: true
, center: new google.maps.LatLng(@Model.StartingLocation)
});
map.addListener('zoom_changed', zoomChange, this);
dataLayer = new google.maps.Data({
map: map
});
window.setInterval(function () { UpdateData() }, 5000);
}
function getScaleSize() {
var scale = null;
var mapZoom = map.getZoom();
switch (mapZoom) {
case 15:
case 16:
case 17:
scale = 1;
break;
case 18:
scale = 10;
break;
case 19:
case 20:
case 21:
case 22:
scale = 20;
break;
default:
scale = 0;
}
return scale;
}
function zoomChange() {
for (var nIndex = 0; nIndex < spotsArray.length; nIndex++) {
var Spot = spotsArray[nIndex].Spot;
var Scale = getScaleSize();
Spot.icon.scale = Scale;
}
}
function UpdateData() {
GetJsonData('@Url.Action("GetMapData")'
,{}
,function(jsonData)
{
$(jsonData).each(function (item)
{ AddUpdateSpotOnMap(jsonData[item]) });
});
};
function AddUpdateSpotOnMap(SpotData) {
//SpotID, Latitude, Longitude, StrokeColor, StrokeOpacity, StrokeWeight, FillColor, FillOpacity
//Check if in Array
var inArrayIndex = NaN;
for (var nIndex = 0; nIndex < spotsArray.length; nIndex++) {
if (SpotData.spotID == spotsArray[nIndex].SpotID) {
inArrayIndex = nIndex;
break;
}
}
if (isNaN(inArrayIndex) == false) {
//Update Color
spotsArray[inArrayIndex].Spot.setOptions({ StrokeColor: SpotData.strokeColor, StrokeOpacity: SpotData.strokeOpacity, StrokeWeight: SpotData.strokeWeight, FillColor: SpotData.fillColor, FillOpacity: SpotData.fillOpacity });
}
else {
var Spot = new google.maps.Marker(
{
position: new google.maps.LatLng(SpotData.latitude, SpotData.longitude),
map: map,
title: SpotData.hoverOver,
icon: {
path: google.maps.SymbolPath.CIRCLE,
strokeColor: SpotData.strokeColor,
strokeOpacity: SpotData.strokeOpacity,
strokeWeight: SpotData.strokeWeight,
fillColor: SpotData.fillColor,
fillOpacity: SpotData.fillOpacity,
scale: 5 }
});
spotsArray.push({ SpotID: SpotData.spotID, Spot: Spot });
dataLayer.add(Spot);
}
};
</script>
Dictionary<string, string>
更新:请注意,此解决方案使用的是Dictionary,因此不允许重复键。如果您需要复制密钥,我建议您更改Dictionary<string, string> data = new Dictionary<string, string>();
using(StreamReader reader = new StreamReader("C:/YourFilePath.txt"))
{
while (reader.Peek() >= 0)
{
string[] line = reader.ReadLine().Split('=');
data.Add(line[0].TrimEnd(), line[1].TrimStart());
}
}
的此解决方案。顺便说一下,代码会变得更脏一些:
List<KeyValuePair<string, string>>
答案 1 :(得分:1)
我不确定Regex
是否适合此方案,但请在下面找到使用命名组"id"
的解决方案。
var regex = new Regex(@"id.*=\s*(?<id>.+)", RegexOptions.IgnoreCase);
var input = @"ID = Gs3c.H.feab4bc5-6c00-4ee8-9e2e-c486eaddddf8
AESKEY1 = efbf5c9db259e345c205b0da27f6fb459D
AESKEY2 = ea85af9f1e5f42ff4fe8b9f07e7dcebc68
DESKEY1 = 6388a9e1a2fc8981189f0f412ae4e8
ID = JNPa.T.71664548-82-be2-a51aadd4a6f3
AESKEY1 = 37af9242c8879414e420f46903c16adebd3
AESKEY2 = 1259a1f6f6da03cb3984a117ca617d9ff73
DESKEY1 = 9547dc08db70cb95789f3a59e5c6adebd31";
var ids = regex.Matches(input).Cast<Match>().Select(m => m.Groups["id"]);
以下是正则表达式测试:Regex test
答案 2 :(得分:0)
NicoRiff建议使用常规解析到Dictionary
是可行的方法。这是强制性的基于LINQ的方法:
var data = File.ReadLines("C:/your/file/path.txt")
.Select(l => l.Split('='))
.ToDictionary(k => k[0], v => v[1]);
编辑:正如Nico所指出的那样,当字典包含重复键时,字典将无效。但是,您仍然可以使用LINQ自动排列字典,以便源文本的ID字段是键而不是字段名称。例如,您可以使用以下内容:
var data = File.ReadLines("C:/your/file/path.txt")
.Where(l => !String.IsNullOrEmpty(l))
.Select((l, i) => new { ID = i / 4, Value = l.Split('=') })
.GroupBy(x => x.ID)
.Select(g => new { ID = g.First().Value[1].Trim(), Values = g.ToDictionary(k => k.Value[0].Trim(), v => v.Value[1].Trim()) })
.ToDictionary(k => k.ID, v => v.Values);
之后,您可以遍历data
来获取字段:
foreach (var d in data.Values)
{
string id = d["ID"];
string aesKey1 = d["AESKEY1"];
string aesKey2 = d["AESKEY2"];
string desKey1 = d["DESKEY1"];
}
答案 3 :(得分:0)
如果您想将数据放入如下字典:Dicationary<string, Dictionary<string,string>>
如果主词典的key
是ID的值,而内部词典是后面的值,则以下内容将执行此操作:
string[] lines = input.Split('\n');
var myDict = new Dictionary<string, Dictionary<string,string>>();
var currentKey = "";
foreach (string[] keyVal in lines.Where(line=>!string.IsNullOrWhiteSpace(line))
.Select(line => line.Split('=')))
{
if (keyVal[0].StartsWith("ID"))
{
currentKey = keyVal[1].Trim();
myDict.Add(currentKey, new Dictionary<string, string>());
}
else
{
myDict[currentKey].Add(keyVal[0].Trim(), keyVal[1].Trim());
}
}
答案 4 :(得分:-1)