2017-08-28 5 views
0

マップ上にポリゴンを作成するために必要な2つのファイル(fileA.txtとfileB.txt)があります。 FileAは、fileBを参照する参照番号のリストを含む。私はAからそのリストを取得し、streamreaderを使用してBの対応するファイルを見つけることができます。私が掴むことができないのは、そのファイルから必要なデータです。 ADV | | 170613/0448は| 170613/0600は| KRIW || 0 | 1
WYZ023 Star_Valley WYZ013 500130 Jackson_HoleルックアップファイルからBingマップのv8ポリゴンを作成する

は私が太字で番号を取る

:よう

FILEAに見えます、500230を探して、これをfileBで探します:

| FIPS | 500230 |
        59.094 59.091 -138.413 -138.425 59.091 -138.413 -138.425 59.092 59.094 59.091 -138.415 -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で始まります。線は1つの多角形です。数字8は太字の数字の後に緯度の長いペアの数を表します。この8は4から20までの任意の数になります。また、各FIPS |内の緯度経度のこれらの「グループ」のうちの1〜20の任意の場所を持つことができます。

最後に、私はそれぞれの緯度の長いペアのリストを取得しようとしています| FIPS |これは、| FIPS |それは見上げられる。

または配列の配列。何かご意見は?

UPDATE:これは私が思いついたものですが、私は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が巨大ではない場合、私はキーがFIPSコードであり、値が配列の配列である辞書に最初FILEBを解析推薦緯度、長いペア、またはアプリケーション内にある座標オブジェクト(数字も問題なく動作します)そこからfileAを解析するときに、fipsの値を見つけたときは、辞書をチェックしてください。これは最も簡単な実装です。

ただし、fileBが大量の場合は、コンピュータまたはサーバー上のメモリ(これを解析する場所)が問題になることがあります。または、fileAがfileB内のデータの小さなサブセットのみを参照する場合、fileB内のすべてのデータを解析する可能性は最大ではありません。このような場合は、fileAを解析し、fipsコードのリストを取得します。次に、fipsコードを見つけてfileAのリストに含まれているかどうかを調べるまで、fileBをスキャンします。そうであれば、fileBからそのデータを解析し、その値をfileAリストから削除します。 filaAリスト内のすべての項目が削除されるか、fileBの最後に達するまでこれを続行します。 fileBをスキャンするために、カスタムストリームリーダーを書くことができます。ファイルが大量でない場合は、文字列として全体を読み込み、インデックスと部分文字列を使ってfileBをスキップしてfipsを探します。

+0

ありがとうございました。私の更新を参照してください。ファイルBは非常に大きくなります。それは95,697行で6MBです。 – bradoxbl

+0

6MBは大きくありません。 60MBは中程度です。 – rbrundritt

関連する問題