C\#Lrc 가사 파일 해석 과정 상세 설명

6244 단어 C#해석 하 다.
많은 사람들 이 가사 파일 을 해석 할 때 큰 문자 처리 코드 를 썼 고 잘 보이 지 않 아 스스로 연 구 했 습 니 다.
 우선 Lrc 파일 을 알 아 보 겠 습 니 다.
 시간 형식:
 1.표준 형식:[분:초.밀리초]가사
 주석:괄호,사칭,점 호 는 모두 영어 입력 상 태 를 요구 합 니 다.
 2.기타 형식 ①:[분:초]가사;
 3.기타 형식 ②:[분:초:밀리초]가 사 는 표준 형식 에 비해 초 뒤의 점 호 는 콜론 으로 바 뀌 었 다.
표준 형식:
 그 형식 은'[표지 명:값]'이다.대소 문자 등가.다음은 미리 정 의 된 탭 입 니 다.
[ar:연예인 명]
[ti:곡 명]
[al:앨범 명] 
[by:편집자(LRC 가 사 를 편집 하 는 사람 을 가리 키 는 말)] 
[offset:시간 보상 치]그 단 위 는 밀리초 이 고 정 치 는 전체 가 앞 당 겨 지고 마이너스 가 반대 임 을 나타 낸다.이것 은 디 스 플레이 속 도 를 전체적으로 조정 하 는 데 쓰 인 다.
기준 이 좋 군요.기준 에 따라 하 겠 습 니 다. 

 public class Lrc
 {
  /// <summary>
  ///   
  /// </summary>
  public string Title { get; set; }
  /// <summary>
  ///    
  /// </summary>
  public string Artist { get; set; }
  /// <summary>
  ///   
  /// </summary>
  public string Album { get; set; }
  /// <summary>
  ///     
  /// </summary>
  public string LrcBy { get; set; }
  /// <summary>
  ///    
  /// </summary>
  public string Offset { get; set; }

  /// <summary>
  ///   
  /// </summary>
  public Dictionary<double, string> LrcWord = new Dictionary<double, string>();

  /// <summary>
  ///       
  /// </summary>
  /// <param name="LrcPath">    </param>
  /// <returns>      (Lrc  )</returns>
  public static Lrc InitLrc(string LrcPath)
  {
   Lrc lrc = new Lrc();
   using (FileStream fs = new FileStream(LrcPath, FileMode.Open, FileAccess.Read, FileShare.Read))
   {
    string line;
    using (StreamReader sr = new StreamReader(fs, Encoding.Default))
    {
     while ((line = sr.ReadLine()) != null)
     {
      if (line.StartsWith("[ti:"))
      {
       lrc.Title = SplitInfo(line);
      }
      else if (line.StartsWith("[ar:"))
      {
       lrc.Artist = SplitInfo(line);
      }
      else if (line.StartsWith("[al:"))
      {
       lrc.Album = SplitInfo(line);
      }
      else if (line.StartsWith("[by:"))
      {
       lrc.LrcBy = SplitInfo(line);
      }
      else if (line.StartsWith("[offset:"))
      {
       lrc.Offset = SplitInfo(line);
      }
      else
      {
       Regex regex = new Regex(@"\[([0-9.:]*)\]+(.*)", RegexOptions.Compiled);
       MatchCollection mc = regex.Matches(line);
       double time = TimeSpan.Parse("00:" + mc[0].Groups[1].Value).TotalSeconds;
       string word = mc[0].Groups[2].Value;
       lrc.LrcWord.Add(time, word);
      }
     }
    }
   } 
   return lrc;
  }

  /// <summary>
  ///     (    )
  /// </summary>
  /// <param name="line"></param>
  /// <returns>      </returns>
  static string SplitInfo(string line)
  {
   return line.Substring(line.IndexOf(":") + 1).TrimEnd(']');
  }
 }

한 줄 코드:Lrc lrc=Lrc.InitLrc("test.lrc"); 
분 리 된 가 사 를 Dictionary에 넣 었 습 니 다.물론 배열 로 저장 할 수도 있 습 니 다.형식 은 실제 용 도 를 봐 야 합 니 다.이것들 을 모두 TimeSpan 에 맡 겨 서 하 세 요. 
테스트: 


옛날 에 어떤 사람 이 이 문 제 를 제기 했다.한 줄 의 가사 에 여러 시간 이 잘못 보 고 될 수 있 고 이렇게 오 랜 시간 이 지나 도 좋 은 방안 을 제공 하 는 사람 이 없 었 다.오늘 나 는 시간 을 좀 써 서 수정 했다.다음은 가 사 를 얻 는 방법 이다. 
 

/// <summary>
  ///       
  /// </summary>
  /// <param name="LrcPath">    </param>
  /// <returns>      (Lrc  )</returns>
  public static Lrc InitLrc(string LrcPath)
  {
   Lrc lrc = new Lrc();
   Dictionary<double, string> dicword = new Dictionary<double, string>();
   using (FileStream fs = new FileStream(LrcPath, FileMode.Open, FileAccess.Read, FileShare.Read))
   {
    string line;
    using (StreamReader sr = new StreamReader(fs, Encoding.Default))
    {
     while ((line = sr.ReadLine()) != null)
     {
      if (line.StartsWith("[ti:"))
      {
       lrc.Title = SplitInfo(line);
      }
      else if (line.StartsWith("[ar:"))
      {
       lrc.Artist = SplitInfo(line);
      }
      else if (line.StartsWith("[al:"))
      {
       lrc.Album = SplitInfo(line);
      }
      else if (line.StartsWith("[by:"))
      {
       lrc.LrcBy = SplitInfo(line);
      }
      else if (line.StartsWith("[offset:"))
      {
       lrc.Offset = SplitInfo(line);
      }
      else
      {
       try
       {
        Regex regexword = new Regex(@".*\](.*)");
        Match mcw = regexword.Match(line);
        string word = mcw.Groups[1].Value;
        Regex regextime = new Regex(@"\[([0-9.:]*)\]", RegexOptions.Compiled);
        MatchCollection mct = regextime.Matches(line);
        foreach (Match item in mct)
        {
         double time = TimeSpan.Parse("00:" + item.Groups[1].Value).TotalSeconds;
         dicword.Add(time, word);
        }
       }
       catch
       {
        continue;
       }
      }
     }
    }
   }
   lrc.LrcWord = dicword.OrderBy(t => t.Key).ToDictionary(t => t.Key, p => p.Value);
   return lrc;
  }


이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기