إزالة علامات الاقتباس و الفواصل من السلسلة في الخلية

StackOverflow https://stackoverflow.com/questions/7917

  •  08-06-2019
  •  | 
  •  

سؤال

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

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

تحرير:

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

هل كانت مفيدة؟

المحلول

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

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

/[,"]/

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

/[^0-9\.]/

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

نصائح أخرى

أعتقد هنا هو أنه نظرا لأن البيانات كان قادرا على استيراد هذا المجال هو في الواقع varchar أو بعض الحرف مجال لأن المستوردة إلى حقل رقمي قد فشلت.هنا كان اختبارا جريت محض MySQL, SQL الحل.

  1. الجدول هو فقط عمود واحد (ألفا) هذا هو varchar.

    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. عبارة Update.

    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, ',', ''), '"', '' );

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


أيضا أن تكون حذرا مع 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"

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

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

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

هنا PHP الطريقة:

$stripped = str_replace(array(',', '"'), '', $value);

رابط الصفحة W3Schools

فعلا nlucaroni ، قضيتك ليس صحيحا تماما.المثال الخاص بك لا يتضمن مزدوجة ونقلت لذلك

id,age,name,...
1,23,phil,

لن تطابق regex.فإنه يتطلب تنسيق "XXX,XXX".لا أستطيع التفكير في مثال عندما يطابق بشكل غير صحيح.

جميع المثال التالي لن تشمل deliminator في regex:

"111,111",234
234,"111,111"
"111,111","111,111"

واسمحوا لي أن أعرف إذا كنت تستطيع التفكير في المثال والمثال.

هتاف!

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

سيكون لديك لتشغيل استعلام تحديد مع regex جملة where.

شيء مثل

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

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

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

أمري هل إزالة جميع'،''"'.

من أجل تحويل اللدغة "1,000" أكثر دقة, سوف تحتاج إلى الأمر التالي.

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

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

عادة ما أقوم به عندما أفعل شيئا من هذا القبيل هو أول محل كل فصل ونقلت (عادة) الفاصلة المنقوطة من خلال علامات التبويب.

  • البحث: ";"
  • محل:

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

  • البحث: ^([ ]+) ([ ]+) ([0-9]+),([0-9]+)
  • محل: \1 \2 \3\4

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

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

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

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

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top