mysql - إزالة ونقلت والفواصل من سلسلة في الخلية



regex string (6)

أنا استيراد بعض البيانات من ملف CSV ، والأرقام التي هي أكبر من 1000 الحصول تحولت إلى 1,100 الخ.

ما هي طريقة جيدة لإزالة كل من علامات الاقتباس والفاصلة من هذا حتى أتمكن من وضعه في مجال int ؟

تصحيح:

البيانات في الواقع بالفعل في جدول الخلية، لذلك أنا بحاجة إلى أن تكون قادرة على هذا باستخدام سكل. آسف للخلط.

https://src-bin.com


Answer #1

الحل للمسألة المتغيرة هو في الأساس نفسه.

سيكون لديك لتشغيل الاستعلام حدد مع التعبير العادي حيث البند.

سومثينغ مثل

Select *
  FROM SOMETABLE
  WHERE SOMEFIELD REGEXP '"(\d+),(\d+)"'

إلى الأمام من هذه الصفوف، تريد إجراء الاستعاضة التفسيرية التالية s / "(\ d +)، (\ d +)" / $ 1 $ 2 / ثم قم بتحديث الحقل مع القيمة الجديدة.

يرجى جوزيف بيكورارو على محمل الجد والحصول على نسخة احتياطية قبل القيام تغييرات الشامل على أي ملفات أو قواعد البيانات. لأنه كلما كنت تفعل التعبير العادي، يمكنك الفوضى على محمل الجد البيانات إذا كانت هناك حالات التي كنت قد غاب.


Answer #2

جواب دانيال والديلة لديهم مشكلة واحدة: يزيلون جميع الاقتباسات والفواصل في الملف كله.

ما أفعله عادة عندما يتعين علي القيام بشيء من هذا القبيل هو استبدال جميع علامات الفواصل الفاصلة و (عادة) بفواصل منقوطة.

  • بحث: "؛"
  • استبدال: \ t

وبما أنني أعرف العمود الذي ستتأثر به القيم، فأنا أفعل بحثا آخر واستبدل:

  • سيرتش: ^ ([\ t] +) \ t ([\ t] +) \ t ([0-9] +)، ([0-9] +) \ t
  • استبدال: \ 1 \ t \ 2 \ t \ 3 \ 4 \ t

... نظرا لقيمة الفاصلة في العمود الثالث.

يجب أن تبدأ ب "^" للتأكد من أنه يبدأ في بداية السطر. ثم تكرر ([0-9] +) \ t كلما كانت هناك أعمدة تريد فقط تركها كما هي.

([0-9] +)، ([0-9] +) للبحث عن قيم حيث يوجد عدد، ثم فاصلة ثم رقم آخر.

في سلسلة استبدال نستخدم \ 1 و \ 2 للحفاظ فقط القيم من السطر تحريرها، وفصلها مع \ t (علامة التبويب). ثم وضعنا \ 3 \ 4 (لا علامة التبويب بين) لوضع اثنين من مكونات عدد دون فاصلة الحق بعد بعضها البعض. سيتم ترك جميع القيم بعد ذلك وحده.

إذا احتجت إلى أن يكون لديك فاصلة منقوطة لفصل العناصر، يمكنك بعد ذلك الاستمرار في استبدال علامات التبويب بفواصل منقوطة. ولكن بعد ذلك - إذا تركت علامات الاقتباس - سيكون لديك للتأكد من أن قيم النص لا تحتوي على أي الفاصلة المنقوطة أنفسهم. لهذا السبب يفضل استخدام تاب كفاصل عمود.

وعادة ما تفعل ذلك في محرر نص عادي (إديتبلوس) التي تدعم ريجيكس، ولكن نفس ريجيكس يمكن استخدامها في أي لغة البرمجة.


Answer #3

هل يمكن استخدام هذا الأمر بيرل.

Perl -lne 's/[,|"]//; print' file.txt > newfile.txt

قد تحتاج للعب حولها معها قليلا، ولكن يجب أن تفعل خدعة.


Answer #4

هنا هو حالة جيدة للتعبيرات العادية. يمكنك تشغيل البحث واستبدال البيانات إما قبل استيراد (أسهل) أو في وقت لاحق إذا كان استيراد سكل قبلت تلك الأحرف (ليس تقريبا سهلة). ولكن في كلتا الحالتين، لديك أي عدد من الطرق للقيام بإيجاد واستبدال، سواء كان ذلك المحررين، لغات البرمجة، برامج واجهة المستخدم الرسومية، الخ تذكر أن كنت تريد الذهاب إلى العثور على واستبدال جميع الشخصيات السيئة.

تعبير عادي نموذجي للعثور على الفاصلة وعروض الأسعار (على افتراض مجرد علامات الاقتباس المزدوجة) هو: (القائمة السوداء)

/[,"]/

أو، إذا وجدت شيئا قد يتغير في المستقبل، هذا التعبير العادي، يطابق أي شيء باستثناء عدد أو نقطة عشرية. (القائمة البيضاء)

/[^0-9\.]/

ما نوقش من قبل الناس أعلاه هو أننا لا نعرف كل البيانات في ملف كسف الخاص بك. يبدو أنك تريد إزالة الفواصل والاقتباسات من جميع الأرقام في ملف كسف. ولكن لأننا لا نعرف ما هو آخر في ملف كسف نريد أن نتأكد من أننا لا تفسد البيانات الأخرى. مجرد عمياء القيام إيجاد / استبدال يمكن أن تؤثر على أجزاء أخرى من الملف.


Answer #5

أمري إزالة كل '،' و '' '.

من أجل تحويل اللدغة "1،000" أكثر صرامة، سوف تحتاج الأمر التالي.

Perl -lne 's/"(\d+),(\d+)"/$1$2/; print' file.txt > newfile.txt

Answer #6

تخميني هنا هو أن البيانات كانت قادرة على استيراد أن الحقل هو في الواقع فارتشار أو بعض الأحرف الحقل، لأن الاستيراد إلى حقل رقمي قد فشلت. هنا كان حالة اختبار ركض بحتة ميسكل، حل سكل.

  1. الجدول هو مجرد عمود واحد (ألفا) هو فارتشار.

    mysql> desc t;
    
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | alpha | varchar(15) | YES  |     | NULL    |       | 
    +-------+-------------+------+-----+---------+-------+
  2. إضافة سجل

    mysql> insert into t values('"1,000,000"');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from t;
    
    +-------------+
    | alpha       |
    +-------------+
    | "1,000,000" | 
    +-------------+
  3. تحديث البيان.

    mysql> update t set alpha = replace( replace(alpha, ',', ''), '"', '' );
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from t;
    
    +---------+
    | alpha   |
    +---------+
    | 1000000 | 
    +---------+

حتى في نهاية البيان الذي استخدمته كان:

UPDATE table
   SET field_name = replace( replace(field_name, ',', ''), '"', '' );

نظرت إلى وثائق الخلية و لم تبدو وكأنني يمكن أن تفعل التعابير العادية تجد واستبدال . على الرغم من أنك يمكن، مثل إلديلا ، استخدام تعبير عادي لإيجاد ثم حل بديل لاستبدال.

أيضا كن حذرا مع s/"(\d+),(\d+)"/$1$2/ لأن ماذا لو كان الرقم أكثر ثم مجرد فاصلة واحدة، على سبيل المثال "1،000،000" كنت تريد الذهاب إلى القيام استبدال عالمي (في بيرل هذا هو s///g ). ولكن حتى مع العالمي استبدال استبدال يبدأ حيث كنت آخر إيقاف (ما لم بيرل هو مختلف)، وسوف تفوت كل مجموعة مفصولة بفواصل أخرى. وهناك حل ممكن هو جعل الخيار الأول (\ d +) مثل s/(\d+)?,(\d+)/$1$2/g ، وفي هذه الحالة، سأحتاج إلى عملية بحث ثانية واستبدالها لتجزئة علامات الاقتباس.

وفيما يلي بعض الأمثلة روبي من التعبيرات العادية التي تعمل على مجرد سلسلة "1،000،000"، لاحظ هناك لا اقتبس مزدوجة داخل السلسلة، وهذا هو مجرد سلسلة من العدد نفسه.

>> "1,000,000".sub( /(\d+),(\d+)/, '\1\2' )
# => "1000,000"  
>> "1,000,000".gsub( /(\d+),(\d+)/, '\1\2' )
# => "1000,000"  
>> "1,000,000".gsub( /(\d+)?,(\d+)/, '\1\2' )
# => "1000000"  
>> "1,000,000".gsub( /[,"]/, '' )
# => "1000000"  
>> "1,000,000".gsub( /[^0-9]/, '' )
# => "1000000"




string