2017-08-28 143 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