2017-08-28 49 views
0

我有两个文件(fileA.txt和fileB.txt),我需要使用它们在地图上创建多边形。 FileA包含引用fileB的引用号列表。我可以从A中获取该列表,并使用streamreader在B中找到相应的文件。我似乎无法抓住的是我需要从该文件获取的数据。从查找文件创建Bing地图v8多边形

FILEA的样子:

|广告服务| 170613/0448 | 170613/0600 | KRIW || 0 | 1
WYZ023 Star_Valley WYZ013 500130 Jackson_Hole

我采取大胆的数,500230,并在fileB中查找它,如下所示:

| FIPS | 500230 |
        59.094 59.091 -138.413 -138.425 59.091 -138.413 59.092 -138.425 59.094 -138.415 59.091 -138.413
        59.101 59.099 -138.397 -138.413 59.099 -138.405 59.101 - 138.413 59.100 -138.397 59.099 -138.405
| FIPS | 500231 |

每条以| FIPS |线是一个多边形。数字8表示粗体数字后面的经纬度长度对的数量。这个8可以是4到20之间的任意数。我也可以在每个| FIPS |中的这些“长”对的“组”中使用从1到20的任意位置。

最后,我试图获取每个| FIPS |等于| FIPS |这是抬头。或者数组的数组。有什么想法吗?

更新:这是我想出来的,但我陷入mainListLoop。 streamReader只读到行尾,但我需要它读取下一个FIPS。有什么建议么?对A的文件格式

[HttpGet] 
     public ActionResult GetWinterData() 
     { 
      var winterFilePaths = HostingEnvironment.MapPath(ConfigurationManager.AppSettings["WatchWarnFilePath"] + "/wstm.txt"); 

      var stringData = new List<string>(); 
      var mainList = new List<WinterModel>(); 

      using (var reader = new StreamReader(winterFilePaths)) 
      { 
       while (!reader.EndOfStream) 
       { 
        var data = reader.ReadLine().Trim(); 

        if (!string.IsNullOrEmpty(data)) 
         stringData.Add(data); 
       } 
       reader.Close(); 
      } 

      WinterModel temp = null; 

      stringData.ForEach(line => 
      { 
       if (line.StartsWith("|")) 
       { 
        if (temp != null) 
        { 
         mainList.Add(temp); 
        } 

        string[] rawData = line.Split('|'); 

        temp = new WinterModel 
        { 
         Type = rawData[0], 
         PolyBorderColor = GetBorderColor(rawData[0], types.WINTER), 
         PolyBorderThickness = GetPolyBorderThickness(rawData[0], types.WINTER), 
         StartDateTime = rawData[1], 
         EndDateTime = rawData[2], 
         innerData = new List<tempInnerWinterModel>(), 
         InfoboxTitle = GetInfoboxTitle(rawData[0], types.WINTER) 
        }; 
       } 
       else 
       { 
        string[] tempLine = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 
        temp.innerData.Add(new tempInnerWinterModel 
        { 
         param1 = tempLine[0], 
         FIPS = tempLine[1], 
         Location = tempLine[2], 
         latLongs = new List<lat_longPairs>() 
        }); 
       } 
      }); 

      mainList.Add(temp); 

      getWinterLatLongPairs2(mainList); 

      var tempJson = (from item in stringData 
          select item.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries) 
         into rawData 
          select new WatchPolygons 
          { 
           Type = rawData[0], 
           PolyBorderColor = GetBorderColor(rawData[0], types.WINTER), 
           StartDateTime = rawData[1], 
           EndDateTime = rawData[2], 
           //Lat_Long_Pairs = getWinterLatLongPairs2(rawData[5]) 
           //Metadata = "Watch Type: " + rawData[0] + "< /br>" + "Watch Start: " + rawData[1] + ' ' + rawData[2] 
           //     + "< /br>" + "Watch End: " + rawData[3] + ' ' + rawData[4] 
          }); 

      return Json((from item in stringData 
         select item.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries) 
         into rawData 
         select new WatchPolygons 
         { 
          Type = rawData[0], 
          PolyBorderColor = GetBorderColor(rawData[0], types.WINTER), 
          StartDateTime = rawData[1], 
          EndDateTime = rawData[2], 
          //Lat_Long_Pairs = getWinterLatLongPairs2(rawData[5]) 
          //Metadata = "Watch Type: " + rawData[0] + "< /br>" + "Watch Start: " + rawData[1] + ' ' + rawData[2] 
          //     + "< /br>" + "Watch End: " + rawData[3] + ' ' + rawData[4] 
         }).ToList(), JsonRequestBehavior.AllowGet); 
     } 


     private static void getWinterLatLongPairs2(List<WinterModel> inputFips) 
     { 
      var searchFips = inputFips; 
      var fipFilePath = HostingEnvironment.MapPath(ConfigurationManager.AppSettings["WatchWarnFilePath"] + "/pfzbnds.tbl"); 
      var stringInnerData = new List<string>(); 

      using (var reader = new StreamReader(fipFilePath)) 
      { 
       while (!reader.EndOfStream) 
       { 
        var line = reader.ReadLine().Trim(); 

        if (!string.IsNullOrEmpty(line) && line.Contains("<FIPS>")) 
        { 
         MainListLoop(inputFips, line, reader); 

         if (inputFips.Last().innerData.Last().latLongs.Count > 0) 
         { 
          return; 
         } 
        } 
       } 
       reader.Close(); 
      } 
      return; 
     } 

     private static void MainListLoop(List<WinterModel> inputFips, string line, StreamReader reader) 
     { 
      inputFips.ForEach(main => 
      { 
       main.innerData.ForEach(fips => 
       { 
        if (line.Contains(fips.FIPS)) 
        { 
         var line2 = reader.ReadLine().Trim(); 
         fips.param1 = "CHANGE"; 

         string[] tempLine = line2.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 
         string numLatLongPairs = tempLine[0]; 
         var latLonPairsWint = new List<lat_longPairs>(); 
         int endIndex = ((Int16.Parse(numLatLongPairs) * 2) + 3 - 1); 

         //grab each pair of lat/longs starting at the 5th and add them to the array 
         for (int i = 5; i < endIndex; i += 2) 
         { 
          fips.latLongs.Add(new lat_longPairs { latitude = decimal.Parse(tempLine[i]), longitude = decimal.Parse(tempLine[i + 1]) }); 
         } 
         return; 
        } 
       }); 
      }); 

     } 

回答

1

不是100%清楚,但如果FILEB是不是巨大的,我会建议解析FILEB首先进入一本字典,其中的关键是符合FIPS代码和值是数组的数组拉特,长对,或者你的应用程序中的任何坐标对象(数字也可以很好地工作)。从那里解析fileA时,当你碰到一个fips值时,检查字典。这将是最简单的实现。

但是,如果fileB很大,那么您的计算机或服务器上的内存(解析此内容)可能是个问题。或者,如果fileA仅引用fileB中的一小部分数据,则解析fileB中的所有数据可能不是最大的。在这种情况下,解析fileA并获取fips代码列表。接下来,扫描fileB,直到找到一个fips代码,并从fileA中查看它是否在您的列表中。如果是,则从fileB解析该数据并从fileA列表中删除该值。继续执行此操作,直到filaA列表中的所有片段都被删除,或者您到达fileB的结尾。为了扫描fileB,你可以编写一个自定义流读取器,或者如果文件不是很大,请将整个东西作为一个字符串读取,然后使用索引和子字符串跳过fileB寻找fips。

+0

谢谢。查看我的更新。文件B将会非常大。它是6MB与95,697行 – bradoxbl

+0

6mb并不大。 60mb是适中的。 – rbrundritt