2017-06-28 23 views
-1

私は少し新しいですが、文字列のn番目のインスタンスをカンマで置き換えようとしています。次のように例えば、私のデータの一部が見えます:文字列内の文字のn番目のインスタンスを置換します。

"2017-06-01T09:15:00+0530",1634.05,1635.95,1632.25,1632.25,769,"2017-06-01T09:16:00+0530",1632.25,1634.9,1631.65,1633.5,506,"2017-06-01T09:17:00+0530",1633.5,1639.95,1633.5,1638.4,991, 

私は'\n'every 6th commaを交換したいので、それは私がregexpパッケージを見て、ちょうどことをしました

"2017-06-01T09:15:00+0530",1634.05,1635.95,1632.25,1632.25,769" 
"2017-06-01T09:16:00+0530",1632.25,1634.9,1631.65,1633.5,506" 
"2017-06-01T09:17:00+0530",1633.5,1639.95,1633.5,1638.4,991" 

のように見えますファインダーのようだ。 stringsパッケージには置き換えがありますが、特定のインデックスを置き換えるために使用する方法がわかりません。私はまた、文字列全体を通らずに特定のインデックスを見つける方法も知らない。ヘルパー関数を書くよりもエレガントなregExソリューションがあるかどうか疑問に思っていました。 文字列は不変なので、それらを編集することはできません。

EDIT:文字列を[]バイトにキャストします。これにより、文字列を編集することができます。残りの部分はかなり単純なforループです。datがデータです。

+1

ですあなたがしようとしたものを投稿してください、問題点を説明してください。 –

答えて

1

だから、私は間違って何をやっていた考え出しました。私は最初にstringとしてデータを持っていましたが、それをbyte[]にキャストすれば、それを適切に更新することができます。

これは私はあなたがしたいのregular expression自体を使用してこれを行うことができます

for i := 0; i < len(dat); i++ { 
    if dat[i] == ',' { 
     count += 1 
    } 
    if count%6 == 0 && dat[i] == ',' { 
     dat[i] = '\n' 
     count = 0 
    } 
+0

文字列を処理するときに、これらのシナリオの子で[]ルーンと見なされます –

+0

なぜ、より好ましいでしょうか? – S2C

+0

あなたが文字定数と考えるものは、Goで 'rune'定数と呼ばれます。ルーンにはユニコード文字(32ビット)が1つしか含まれていませんが、バイトは8バイトしか格納できません。文字列を[]バイトとして扱うASCII文字だけの文字列は他のユニコード文字を持つと失敗します –

1

これが入力された場合は、,"文字列を\n"に置き換える必要があります。これにはstrings.Replace()を使用できます。これにより最後の末尾のカンマが残され、スライスして削除できます。

ソリューション:

in := `"2017-06-01T09:15:00+0530",1634.05,1635.95,1632.25,1632.25,769,"2017-06-01T09:16:00+0530",1632.25,1634.9,1631.65,1633.5,506,"2017-06-01T09:17:00+0530",1633.5,1639.95,1633.5,1638.4,991,` 
out := strings.Replace(in, ",\"", "\n\"", -1) 
out = out[:len(out)-1] 
fmt.Println(out) 

出力(Go Playground上でそれを試してみてください)です。

"2017-06-01T09:15:00+0530",1634.05,1635.95,1632.25,1632.25,769 
"2017-06-01T09:16:00+0530",1632.25,1634.9,1631.65,1633.5,506 
"2017-06-01T09:17:00+0530",1633.5,1639.95,1633.5,1638.4,991 
+0

ありがとう!いくつかのことがあります:(1)このコンテキストでReplace関数がどのくらい正確に機能しているか。私は文字列に '\"をパターンで表示しないので、置き換えるたびに正確に何を見つけるのですか?(2)ファイルの各行の最後にコンマが残っています。各行の末尾から削除しますか? – S2C

+0

@ S2Cそれは[解釈された文字列リテラル](https://golang.org/ref/spec#String_literals)で、 '\"は一重引用符を意味します(引用符自体は文字列リテラルの終わりを意味するため) '、'のテキストを見つけ、改行と引用符で置き換えます。正確に何が必要です。 – icza

+0

ありがとう!私はあなたが新しい行で置き換えたいコンマには常にそれの後に引用符があるという事実を利用しているのを見ています。この文脈では動作しますが、文字のn番目のインスタンスが置き換えられるという唯一のパターンが唯一のものである場合は、同様のことを行う必要があるという別のコンテキストがあります。 – S2C

1

あなたは柔軟たい場合。

package main 

import (
    "fmt" 
    "strings" 
) 

func main() { 
    input := `"2017-06-01T09:15:00+0530",1634.05,1635.95,1632.25,1632.25,769,"2017-06-01T09:16:00+0530",1632.25,1634.9,1631.65,1633.5,506,"2017-06-01T09:17:00+0530",1633.5,1639.95,1633.5,1638.4,991,` 
    var result []string 

    for len(input) > 0 { 
     token := strings.SplitN(input, ",", 7) 
     s := strings.Join(token[0:6], ",") 
     result = append(result, s) 
     input = input[len(s):] 
     input = strings.Trim(input, ",") 
    } 
    fmt.Println(result) 
} 

https://play.golang.org/p/mm63Hx24ne

0

n番目の文字のインスタンス以外のメトリック他に頼ることなく、問題を解決するには、以下の簡単なforループを使用することができました。 デフォルトのgolangパッケージで提供されているregexpの実装は、入力のサイズが時間的に一定であることが保証されています。 (これは、正規表現のほとんどのオープンソース実装によって保証されないプロパティです。)

ここヘクタールがregexp

package main 

import (
    "fmt" 
    "regexp" 
) 

func main() { 
    originalString := `"2017-06-01T09:15:00+0530",1634.05,1635.95,1632.25,1632.25,769,"2017-06-01T09:16:00+0530",1632.25,1634.9,1631.65,1633.5,506,"2017-06-01T09:17:00+0530",1633.5,1639.95,1633.5,1638.4,991,` 
    re := regexp.MustCompile("(([^,]+,){5}[^,]+),") 
    fmt.Println(re.ReplaceAllString(originalString, "$1\n")) 
} 

このsusingを達成することができる。ここプレイリンクはhere

+0

@ S2Cもしあなたの最初の質問のためのこの考え方。 –

関連する問題