[vim] csv에서 지정한 문자 수에 따라 다른 열의 문자열 길이를 변경합니다
csv 두 번째 열의 문자열을 첫 번째 열에서 지정한 문자열로 변경합니다.
개시하다
文字数,文字列
10,hogehogeho
10,over_over_over_over
30,aabbcc
40,男女男男
골대文字数,文字列
10,hogehogeho
10,Invalid
30,aabbcccccccccccccccccccccccccc
40,男女男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男男
사전 요구 사항:
해당되는 내용:
(文字数5, 文字列"abc" -> 修正後文字列"abccc")
(文字数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
Reference
이 문제에 관하여([vim] csv에서 지정한 문자 수에 따라 다른 열의 문자열 길이를 변경합니다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/rapan931/articles/ab1718164cbea0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)