2016-03-19 21 views
0

Son bir Wikipedia dökümü MySQL veritabanına aktarmaya çalışıyorum. Sorun şu ki, INSERT INTO text MySQL komutlarını kullanarak 50 GiB text tablosunu ekliyorum ve bunları bir metin dosyasına dönüştürmek istiyorum. mysql -u USERNAME -p DBNAME < text.sql çok yavaş kullanarak AncakMySQL "INSERT" komutlarını metne dönüştür

INSERT INTO text (old_id,old_text,old_flags) VALUES (id1,'text1','flags1'),(id2,'text2','flags2'),...,(idN,'textN','flagsN'); 

:

Benim text.sql dosyası aşağıdaki yapıya sahiptir. Zaten autocommit, unique_checks ve foreign_key_checks'u devre dışı bırakıyorum ve tüm işlemleri bir START TRANSACTION; ... COMMIT; bloğunun içine ekliyorum, ancak içe aktarma işlemi hala çok yavaş.

Araştırmadan sonra, LOAD DATA INFILE;'un INSERT komutlarını kullanmaktan çok daha hızlı olabileceğini here okudum. Bu nedenle, aşağıdaki gibi text.txt için text.sql dönüştürmek için arıyorum: Bunun için awk kullanmayı düşünüyorum ama düzenli ifadeler ile benim deneyim çok sınırlı

id1,'text1','flags1' 
id2,'text2','flags2' 
... 
idN,'textN','flagsN' 

. Ayrıca, her bir INSERT komutu, tek bir satırda, yukarıda gösterildiği gibi, değerleri ayıklamak için benim için daha da zorlaştırarak verilir.

text.sql dosyasının 50 GiB olduğunu varsayalım, awk'u kullanmanızı veya bir C/C++ programı geliştirmeyi önerir misiniz? awk iyi bir yaklaşımsa, dönüşüme nasıl ulaşabilirim?

giriş 1. Örnek:

INSERT INTO text (old_id,old_text,old_flags) VALUES (id1,'text1','flags1'),(id2,'text2','flags2'),(id3,'text3','flags3'); 

Çıkış 1. Örnek:

id1,'text1','flags1' 
id2,'text2','flags2' 
id3,'text3','flags3' 

giriş 2. Örnek:

INSERT INTO page (page_id,page_namespace,page_title,page_restrictions,page_is_redirect,page_is_new,page_random,page_touched,page_latest,page_len,page_content_model) VALUES (10,0,'AccessibleComputing','',1,0,RAND(),DATE_ADD('1970-01-01', INTERVAL UNIX_TIMESTAMP() SECOND)+0,631144794,69,'wikitext'),(12,0,'Anarchism','',0,0,RAND(),DATE_ADD('1970-01-01', INTERVAL UNIX_TIMESTAMP() SECOND)+0,703037144,180446,'wikitext'); 

çıkış # 2 (değerler parantez ile) örnek:

10,0,'AccessibleComputing','',1,0,RAND(),DATE_ADD('1970-01-01', INTERVAL UNIX_TIMESTAMP() SECOND)+0,631144794,69,'wikitext' 
12,0,'Anarchism','',0,0,RAND(),DATE_ADD('1970-01-01', INTERVAL UNIX_TIMESTAMP() SECOND)+0,703037144,180446,'wikitext' 

giriş 3. Örnek: (ile kaçan "ya da ")

INSERT INTO text (old_id,old_text,old_flags) VALUES (631144794,'#REDIRECT [[Computer accessibility]]\n\n{{Redr|move|from CamelCase|up}}','utf-8'),(703037144,'{{Redirect2|Anarchist|Anarchists 

| Anarşistleri (belirsizliği giderme)}} \ N {{s-hareketlerinin | hayali karakter | Anarþist (çizgi) | diğer kullanımlar indef}} \ n {{İngiliz İngilizcesi | date = Ocak 2014}} ',' utf-8 ');

Çıktı 3. örnek:

631144794,'#REDIRECT [[Computer accessibility]]\n\n{{Redr|move|from CamelCase|up}}','utf-8' 
703037144,'{{Redirect2|Anarchist|Anarchists|the fictional character|Anarchist (comics)|other uses|Anarchists (disambiguation)}}\n{{pp-move-indef}}\n{{Use British English|date=January 2014}}','utf-8' 

düzenleme: Biraz daha araştırma sonrasında, normal ifadeler kullanarak örnekler 2. ve 3. dönüştürülemez olabileceği anlaşılıyor: kaynakları: #1, #2.

+0

Dönüştürüldükten sonra dosyayı daha küçük parçalara bölerim, örn. 'split - lines n 'yi kullanarak bir 50G dosyası yerine – Cez

cevap

1

istediğin bu değilse:

$ awk -v FPAT='[(][^)]+[)]' '{for (i=2;i<=NF;i++) print substr($i,2,length($i)-2)}' file 
id1,'text1','flags1' 
id2,'text2','flags2' 
idN,'textN','flagsN' 

sonra daha net, test edilebilir numune giriş ve beklenen çıkışı sağlamak üzere sorunuzu düzenleyin.

Yukarıdaki awes FPAT için kullanılan GNU awk, diğer hatalarla birlikte bir while(match()) döngü kullanırsınız.

+0

Doğru, Ed, soruyu çok net olmadığı için düzenledim. Tek bir INSERT ifadesindeki tüm değerler tek bir satırdadır; Kod parçacığınız gerçekten farklı satırlarda olsaydı (orijinal olarak yazdığım gibi) çalışırdı. Şimdi net bir giriş ve çıkış örneği sağladım. – Adama

+0

Cevabımı düzenledim, şimdi bir göz atın. İnsanların gerçek girdilerine benzemeyen örnek girdiler gönderdiklerini sık sık görüyoruz. Bazen bir evde gerçekten bir bifteğin ızgarasını yaparken bir yumurtanın nasıl kızartılacağı konusunda yardım istediklerini merak ediyorum :-). –

+0

Harika teşekkürler. Örneğin # 1 çalışır ve gerçekten bir tablo (yönlendirmeler) dönüştürülür. Ancak, diğer tabloları parantez varsa veya kaçan '' \ '' veya '' \ "' 'kendi değerleri. Ben FPAT kadar baktıktan sonra, örnekler 2. ve 3. Btw. Bunu göstermek eklediğiniz, bu ortaya çıktı sana FPAT için GNU awk gerekli ve ne yapacağını söylemiştim nerede düzenli '' awk'' orada çalışmaz – Adama

0

bunu kullanın:

sed -e 's/(//' -e 's/),//' test.csv 

(uygun şekilde borulu) ve tüm hatlar temiz olacaktır.

ilk Değişim ve elle son satırları.

Saygılar