أكثر

اربط عدة حقول نصية / سلسلة والتي قد يحتوي بعضها على قيم فارغة ArcGIS


أحاول تكرار سلوك هذا الرمز من موقع ESRI.

أريد تكرار مثال الإخراج بتنسيقكل الأنواع، بحيث يربط حقلًا ولكنه يتعامل (يتجاهل) أي حقل يحتوي على قيم NULL.

لسوء الحظ ، لم يعد هذا المثال يعمل في 10.2.2 لأن كل أمثلة NULL ترجع نص "بلا". بدلا من ذلك أريد فقط أن تظهر فارغة.

وها هو الكود.

يسمح "* args" لهذا الروتين بقبول أي عدد من قيم الحقول. # يتم تمرير القيم على هيئة مجموعة Python ، وهي في الأساس قائمة # غير قابلة للتحرير # def concat (* args): # قم بتهيئة قيمة الإرجاع إلى سلسلة فارغة ، ثم قم بتعيين الحرف الفاصل # retval = "" sep = "_ "# لكل قيمة يتم تمريرها في… # لـ t في args: # التحويل إلى سلسلة (هذا يمسك أي أرقام) ، # ثم قم بإزالة الفراغات البادئة واللاحقة # s = str (t) .strip () # أضف قيمة الحقل إلى قيمة الإرجاع ، باستخدام الفاصل # المحدد أعلاه # if s <> ": retval + = sep + s # قم بتقطيع أي فواصل بادئة قبل إرجاع القيمة # return retval.lstrip (sep)

أعتقد أن هذا يجب أن يفعل ما تريد:

def concat (* args): sep = "_" nonnull_args = [str (arg) .strip () لـ arg in args if arg] # Filter NULLs good_args = [arg for arg in nonnull_args if arg] # تصفية الفراغات retval = sep .join (good_args) يعود retval

يتم تمرير Args للتو من خلال مرشحين اثنين والانضمام إليهاسبتمبرفي نهايةالمطاف.


دمج العمود من صفوف متعددة في صف واحد

لقد حصلت على بعض تعليقات customer_comments مقسمة إلى صفوف متعددة بسبب تصميم قاعدة البيانات ، وللتقرير أحتاج إلى دمج التعليقات من كل معرّف فريد في صف واحد. لقد جربت سابقًا شيئًا يعمل مع هذه القائمة المحددة من عبارة SELECT وخدعة COALESCE ولكن لا يمكنني تذكرها ويجب ألا حفظها. لا يمكنني أن أجعله يعمل في هذه الحالة أيضًا ، يبدو أنه يعمل فقط في صف واحد.

يجب أن تبدو نتائجي كما يلي:

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

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


لماذا يتغير ترتيب التسلسل مع نوع جدول محدد بواسطة المستخدم؟

لقد واجهت ما يبدو لي أنه مشكلة ترتيب غريبة عند استخدام CONCAT مع نوع جدول محدد من قبل المستخدم.

لقد وضعت SQL أدناه الذي يسمح لي بإعادة إنتاج هذا:

لدي نوع المستخدم التالي:

والاستعلام التالي لإعداد كل شيء:

وهذا هو الاستعلام الذي أقوم بتشغيله:

إذا كان سطر VariableLineB بدون تعليق ، وتم التعليق على سطر VariableLineA ، يتم إرجاع السلسلة التالية لكلا سطري الاستعلام إذا تم تشغيلهما بشكل فردي أو معًا:

الاسم الأول - إليس ، الاسم الأول - علي ، اللقب - إليس ، اللقب - علي ،

إذا لم يتم التعليق على سطر VariableLineA وتم التعليق على سطر VariableLineB ، فسيتم إرجاع السلسلة التالية لـ QueryLineB ومن على حد سواء استعلامات إذا تم تشغيلها معًا ، ولكن ليس QueryLineA من تلقاء نفسه:

الاسم الأول - إليس ، الاسم الأول - علي ، اللقب - إليس ، اللقب - علي ،

عند تشغيل QueryLineA من تلقاء نفسه ، يتم إرجاع السلسلة التالية:

الاسم الأول - إليس ، اللقب - إليس ، الاسم الأول - علي ، اللقب - علي ،

لماذا تغير النظام؟ ما الذي أراه هنا ، وهل هناك أي طريقة لمنع حدوث ذلك؟

من حيث الاستخدام ، سيتم تمرير قيمValueTable إلى دالة ، ومن المهم أن يظل الترتيب الأصلي (مهما كان ذلك) كما هو.


يمكن استخدام دالة SQLCLR لمحاكاة دالة TRANSLATE Transact-SQL الجديدة في SQL Server 2017.

تعريف الوظيفة

إستعمال

يستخدم هذا التطبيق التجريبي البسيط مقارنة حساسة لحالة الأحرف.

مصدر الرمز

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

هذا هو الكود الذي يقوم بالترجمة:

افترض أن لديك صفوف S في صفوف # String1 و R في #ReplacementMap. لكل صف في #ReplacementMap ، نقوم بربط الجدول ، ونقوم بالتصفية إلى الصف التالي ، و REPLACE () باستخدام هذا الصف. بمجرد عدم وجود المزيد من الصفوف في #ReplacementMap ، يتم إرجاع مجموعة النتائج الكاملة لصفوف S X R. يتم تصفية ذلك وصولاً إلى الترجمة النهائية بواسطة طلب البحث الفرعي. سيقوم الكود بتنفيذ عمليات S X R REPLACE () و R + 1 ينضم إلى مجموعة نتائج صف واحد ، إلى جانب بعض عمليات tempdb الداخلية.

يجب أن يعمل هذا بدون أي تعديلات طالما أن لديك أقل من 101 سلسلة بديلة. يبدو أن الكود يعمل بشكل مشابه للحل الذي نشره Adán Bucio. انتهى هذا الاستعلام على جهازي في حوالي 10 ثوانٍ وانتهى حله في 20 ثانية. ومع ذلك ، يجب ألا تختار الحل الخاص بك على هذا الأساس. يجب عليك استخدام أي رمز يناسبك ، طالما أنه يلبي متطلبات وقت الاستجابة.

لاحظ أن SQL Server 2017 يحتوي على وظيفة مضمنة تجعل هذا النوع من العمليات تافهًا: TRANSLATE.


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

لا أعتقد أن اختلاف التخزين المادي يستحق القلق بشأنه من الناحية العملية. بصفتنا مديري قاعدة بيانات ، لدينا سمكة أكبر بكثير لقليها!

لا أعرف شيئًا عن MySQL و PostgreSQL ، لكن دعني أعالج هذا الأمر قليلاً بشكل عام.

هناك DBMS واحد وهو Oracle الذي لا يسمح باختيار مستخدميه بين NULL و ". وهذا يدل بوضوح على أنه ليس من الضروري التمييز بين الاثنين. هناك بعض العواقب المزعجة:

قمت بتعيين varchar2 على سلسلة فارغة مثل هذا:

ما يلي يؤدي إلى نفس النتيجة

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

صحيحة نحويًا ، لكنها لا تُرجع أبدًا أي صف.

على الجانب الآخر ، عند ربط السلاسل في Oracle. يتم التعامل مع varchars الفارغة كسلاسل فارغة.

عائدات abc. قد تقوم DBMS الأخرى بإرجاع NULL في هذه الحالات.

عندما تريد التعبير صراحةً عن أنه تم تعيين قيمة ما ، فعليك استخدام شيء مثل ''.

وعليك أن تقلق بشأن ما إذا كان التشذيب ليس نتائج فارغة في NULL

ننظر الآن إلى DBMS حيث لا يتطابق '' مع NULL (مثل SQL-Server)

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

يعتمد ذلك على المجال الذي تعمل عليه. NULL تعني عدم وجود قيمة (أي يوجد لا قيمة له) ، بينما تعني السلسلة الفارغة وجود ملف قيمة السلسلة بطول صفر.

على سبيل المثال ، لنفترض أن لديك جدولاً لتخزين بيانات شخص ويحتوي على عمود "الجنس". يمكنك حفظ القيم كـ "ذكر" أو "أنثى". إذا كان المستخدم قادرًا على اختيار عدم تقديم بيانات الجنس ، فيجب عليك حفظ ذلك على أنه NULL (أي لم يقدم المستخدم القيمة) و ليس سلسلة فارغة (نظرًا لعدم وجود جنس له قيمة '').

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

هناك أيضًا بعض الاختلافات في الجبر العلائقي وقيم NULL: NULL! = NULL ، على سبيل المثال.

يمكنك أيضًا أن تأخذ في الاعتبار نقد Date لـ NULL ومشكلات 3VL في SQL والنظرية العلائقية (ونقد روبنسون لنقد Date ، و Nulls ، والمنطق ثلاثي القيم ، والغموض في SQL: Critiquing Date’s Critique).

تمت الإشارة إلى كلاهما ومناقشتهما مطولاً في مؤشر ترابط SO ذي صلة ، وخيارات لإزالة الأعمدة NULLable من نموذج قاعدة بيانات.

فكرة جديدة ، لها تأثير كبير على اختيارك لـ NULL / NOT NULL إذا كنت تستخدم إطار عمل. أستخدم symfony كثيرًا واستخدام السماح بالحقول الفارغة يبسط بعض الكود والتحقق من البيانات عند معالجة البيانات.

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

كما أنها مختلفة من منظور التصميم:

Soooooo: القيم الخالية ليست سلاسل تافهة ولا العكس.

بعد أن اضطررت إلى العمل مع Oracle (وهو ما لا يسمح لك بالتمييز) توصلت إلى الاستنتاج التالي:

من وجهة نظر منطقية لا يهم. أنا حقا لا أستطيع التفكير أي مثال مقنع حيث يؤدي التمييز بين NULL وسلسلة ذات طول صفري إلى إضافة أي قيمة في DBMS.

مما يلي: إما أن يكون لديك عمود NULL قادر لا يسمح بصفر len أو عمود NOT NULL يسمح بصفر لين. (كلاهما غير ممكن في Oracle ، مثل '' === NULL هناك.)

من تجربتي '' كثيرا أكثر منطقية عند معالجة البيانات ، كما تريد عادةً معالجة عدم وجود سلسلة كسلسلة فارغة: التسلسل ، المقارنة ، إلخ.

للرجوع إلى تجربة Oracle الخاصة بي: لنفترض أنك تريد إنشاء استعلام لطلب بحث. إذا كنت (في عدم Oracle) استخدم '' ، يمكنك فقط إنشاء WHERE columnX = & ltsearchvalue & gt وستعمل من أجل عمليات البحث عن المساواة. إذا كنت تستخدم NULL ، فيجب عليك إجراء WHERE columnX = & ltsearchvalue & gt أو (العمود X هو NULL و searchvalue هو NULL).

المنطق الثاني ، الأكثر تعقيدًا ، هو في الواقع ما عليك القيام به في Oracle ، مثل NULL و '' هما نفس الشيء هناك.


4 إجابات 4

أجريت بعض الاختبارات باستخدام ما يزيد قليلاً عن 6 مل من الصفوف. مع فهرس في عمود المعرف.

هذا ما توصلت إليه.

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

تم تشغيل هذا الإصدار في ما يزيد قليلاً عن دقيقتين.

من شبه المؤكد أن تجميع CLR سيكون أسرع طريقة للقيام بذلك. لكن ربما لا ترغب في استخدام واحد لأي سبب من الأسباب.

أنت تقول إن مصدر هذا استعلام مكلف.

أود أن أتجسد هذا في جدول #temp أولاً للتأكد من أنه يتم تقييمه مرة واحدة فقط.

خطة التنفيذ التي أحصل عليها للاستعلام في السؤال أولاً تقوم بالتسلسل لكل صف في الاستعلام الخارجي ثم تزيل التكرارات حسب المعرف ، SomeField_Combined1 ، SomeField_Combined2.

هذا مسرف بشكل لا يصدق. إعادة الكتابة التالية تتجنب هذا.

ومع ذلك ، بالنسبة لبيانات الاختبار التالية (1000 معرف مع 2156 صفًا لكل معرف بالنسبة لي)

ما زلت أجد حل كينيث من خلال مكالمتي XML PATH بشكل أسرع وأقل كثافة في استخدام الموارد.

لكل معرف مميز في #test ، يتم تنفيذ عمليتين بدلاً من واحدة ولكن هذه العملية أرخص بكثير من إنشاء XML ثم إعادة توزيعه.


نعم ، بتصفية المصفوفة:

وبالتالي ، فإن طريقة JOIN ستعمل فقط على الخلايا غير الفارغة.

يعمل كلا الحلين أعلاه في حالة وجود خلية واحدة على الأقل تحتوي على نص. ومع ذلك:

سيعود ٪٪٪٪ إذا كانت C10: C14 كلها فارغة و.

سيعود # N / A إذا كانت C10: C14 كلها فارغة.

ومع ذلك ، يمكنك تعديل الحل الأول بشكل طفيف لاستبدال علامات٪ بسلاسل فارغة عن طريق تغليف الصيغة بوظيفة SUBSTITUTE كما يلي:

(يظهر في عدة أسطر للتوضيح)

لقد وجدت حلاً آخر:

يمكن أن يكون٪ أي رمز غير موجود بالفعل في القائمة ، مثل الفاصلة أو علامة العطف أو علامة الاستفهام.

textjoin ("vs"، true، C10: C14) true تعني هنا أنه إذا كانت الخلية فارغة ، فتجاهل


4. عمليات استبدال متعددة: استبدل بسلاسل مختلفة

يمكنك الجمع بين أوامر sed:

اعلم أن الأمر مهم (سوف يستبدل sed 's / foo / bar / g s / bar / baz / g' foo بـ baz).

إذا كان لديك عدد كبير من الأنماط ، فمن الأسهل حفظ أنماطك وبدائلها في ملف نصي sed:

أو ، إذا كان لديك عدد كبير جدًا من أزواج الأنماط بحيث يكون ما سبق ممكنًا ، فيمكنك قراءة أزواج الأنماط من ملف (نمطين مفصولتين بمسافات ، ونمط $ واستبدال دولار ، لكل سطر):

سيكون هذا بطيئًا جدًا بالنسبة للقوائم الطويلة من الأنماط وملفات البيانات الكبيرة ، لذا قد ترغب في قراءة الأنماط وإنشاء نص برمجي منها بدلاً من ذلك. ما يلي يفترض أ & lt & lt! & gtspace & lt! & gt & gt المحدد يفصل بين قائمة تطابق & lt & lt! & gtspace & lt! & gt & gtREPLACE أزواج تحدث واحد في كل سطر في الملف الأنماط :

التنسيق أعلاه تعسفي إلى حد كبير ، على سبيل المثال ، لا يسمح بامتداد & lt & lt! & gtspace & lt! & gt & gt في أي من تطابق أو يستبدل. هذه الطريقة عامة جدًا على الرغم من ذلك: في الأساس ، إذا كان بإمكانك إنشاء دفق إخراج يبدو مثل نص sed النصي ، فيمكنك حينئذٍ أن يكون مصدر هذا التدفق كبرنامج نصي sed عن طريق تحديد ملف البرنامج النصي الخاص بـ sed كـ - stdin.

يمكنك دمج وتسلسل نصوص متعددة بطريقة مماثلة:

سوف يدمج POSIX sed جميع البرامج النصية في واحدة بالترتيب الذي تظهر به في سطر الأوامر. لا يجب أن ينتهي أي من هذه الأمور n بخط عريض.

يمكن أن يعمل grep بنفس الطريقة:

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


5 التاريخ

نشأت قاعدة بيانات Unihan كمكدس Hypercard باستخدام البيانات المقدمة من منظمات مثل Apple و RLG و Xerox. تم العثور على الإصدارات المطبوعة في معيار يونيكود ، الإصدار 1.0 ، المجلد 2. كانت الإصدارات الإلكترونية متوفرة على قرص مرن في شكل ملف يسمى CJKXREF.TXT.

تم تضمين أول إصدار إلكتروني عام لـ CJKXREF.TXT (961 كيلو بايت) مع Unicode 1.1.5 في يوليو 1995. هذا الإصدار من الملف بتنسيق متعدد الأعمدة ويتضمن البيانات المستخدمة في الطباعة معيار يونيكود ، الإصدار 1.0 ، المجلد 2 باستثناء تعيينات Fujitsu ، التي تبين أنها غير صحيحة وتم سحبها.

تمت مراجعة النسخة الإلكترونية من قاعدة بيانات Unihan بشكل كبير لنشر Unicode 2.0.0 في يوليو 1996. تمت إعادة تسمية الملف UNIHAN.TXT ليكون رابط الأرشيف الدائم Unihan-1.txt (7.9 ميجابايت). تنسيق الملف هو بشكل أساسي نفس الإصدار الحالي ، على الرغم من أنه تم دمجه في ملف واحد. تم تسمية الحقول بشكل صريح لأول مرة. تم الحفاظ على البيانات في ذلك الوقت باستخدام برنامج قاعدة بيانات مخصص يستند إلى MacApp. استخدمت التعليمات البرمجية المصدر لهذا البرنامج نوعًا مُعدَّدًا لعلامات الحقول الرقمية ، واستخدمت أسماء العداد (كل منها يبدأ بحرف "k" يشير إلى استخدامها كثابت) في الملف النصي كأسماء حقول.

تم اقتطاع Unihan-1.txt في مرحلة ما عن طريق الخطأ على الخط 330،553 (جزئيًا من خلال بيانات U + 8BC1). لم يتم توفير نسخة مصححة من الملف. بدلاً من ذلك ، تم استبداله بملف Unihan-2.txt (10 ميجابايت) الذي تم إصداره باستخدام Unicode 2.1.2 في مايو 1998.

أدت صعوبة تنزيل ملف بحجم 19 ميجابايت باستخدام تقنية ذلك الوقت إلى إتاحة قاعدة بيانات Unihan كملف نصي واحد وأرشيفات مضغوطة لهذا الملف النصي اعتبارًا من Unicode 3.1.0 في مارس 2001. تنسيق ظلت قاعدة بيانات Unihan بشكل أساسي دون تغيير حتى Unicode 5.1.0 (أبريل 2008) ، عندما لم يعد الملف النصي مدرجًا وأصبحت قاعدة البيانات متاحة فقط كأرشيف مضغوط.

أخيرًا ، تم تغيير الأرشيف من احتواء ملف نصي واحد إلى يحتوي على ملفات نصية متعددة اعتبارًا من Unicode 5.2.0 (أكتوبر 2009).


استكشاف أخطاء الانقسامات والتقسيمات المخصصة وإصلاحها

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

خيارات التقسيم والتقسيم المخصصة مفقودة لنوع مصدر بيانات مدعوم: تتوفر خيارات التقسيم والتقسيم المخصص فقط للحقول التي تعد من نوع بيانات السلسلة.

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

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

في هذه الحالة ، سينشئ التقسيم حقلاً جديدًا بالقيم التالية:

لن يُنشئ التقسيم حقلاً منفصلاً لـ "ZIP-" لأن التقسيم يستخدمه كفاصل.


شاهد الفيديو: What is ArcGIS? (شهر اكتوبر 2021).