[vim] csv에서 지정한 문자 수에 따라 다른 열의 문자열 길이를 변경합니다

7477 단어 Vimcsvtech
갑자기 대응이 필요하기 때문에 필기를 해야 한다.
csv 두 번째 열의 문자열을 첫 번째 열에서 지정한 문자열로 변경합니다.
개시하다
文字数,文字列
10,hogehogeho
10,over_over_over_over
30,aabbcc
40,男女男男
골대
文字数,文字列
10,hogehogeho
10,Invalid
30,aabbcccccccccccccccccccccccccc
40,男女男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男

사전 요구 사항:

  • 제1열은 1개 이상의 수치를 입력해야 한다
  • 2열에는 행 코드, 쉼표가 포함되지 않음
  • 1열과 2열 모두 2쿼터가 없는 포위
  • 두 번째 열에는 때때로 멀티바이트 문자가 포함되어 있습니다.
  • 해당되는 내용:

  • 두 번째 열의 문자열이 첫 번째 열의 문자열 수에 도달하지 못하면 두 번째 열의 끝 문자를 추가하여 문자열 수에 도달하는 문자열로 수정(文字数5, 文字列"abc" -> 修正後文字列"abccc")
  • 두 번째 열의 문자 수가 첫 번째 열의 문자 수를 초과하면 "Invalid"(文字数5, 文字列"abcdef" -> 修正後文字列"Invalid")로 수정됨
  • 두 번째 열의 문자 수가 첫 번째 열의 문자 수와 일치하면 수정하지 않습니다.
  • 이루어지다


    먼저 다음 함수를 만듭니다.
    " 文字数(第1カラム)と文字列(第2カラム)を受け取り、修正後の文字列を返却する関数
    function! MyCsvFormat(num, str) abort
      let l:chars = split(a:str, '\ze')
      let l:length = len(chars)
      if a:num < length
        return "Invalid"
      else
        return a:str . repeat(l:chars[-1], a:num - l:length)
      endif
    endfunction
    
    그리고 csv 파일을 열고 다음 명령을 실행합니다.
    :%s/^\(\d\+\),\zs\(.\+\)$/\=MyCsvFormat(submatch(1), submatch(2))/g
    
    이상은 기대에 따라 수정되었습니다.:substitute 어떤 작업을 수행하고 있는지 살짝 설명\(...\)에서 캡처\zs 성냥의 시작지점을 지정(이번으로 교체의 시작지점)\= 에서 MyCsvFormat 함수로 형식 바꾸기submatch()에서 포획된 첫 번째 열과 두 번째 열을 함수 매개 변수로 지정합니다.\= 사용하면 함수를 호출할 수 있기 때문에 상관없습니다.
    나는 그것이 매우 강하다고 생각한다. 꼭 사용해 보세요.
    그리고 MyCsvFormat에서 문자열의 문자 수를 얻었을 때 len() 를 사용했지만, 이 함수는 문자 수가 아니라 바이트 수를 되돌려 주기 때문에 좋지 않습니다.어쩔 수 없이split() 배열하고 요소수에 따라 글자수를 구하니 좀 이상하다.strchars() 문자 수를 되돌려 주는 거대한 함수를 찾았지만 도움말에 기재된 합성문자가 무엇인지 몰라 사용하지 않았다.다만, 다자 바이트 문자를 포함하는 문자열의 끝을 얻을 수 있는 문자도 일시적으로 배열"漢字漢"[-1:]할 수 있을 것 같고 다자 바이트에 대응하는 문자도 없을 것 같아서 이렇게 해도 됩니다!
    :h :substitute
    :h len()
    :h split()
    :h strchars()
    :h submatch()
    :h s/\=
    :h /\(
    :h /\zs
    

    좋은 웹페이지 즐겨찾기